在Haskell中使用词法作用域类型变量解析错误



当我向GHC提交代码时

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies, ScopedTypeVariables #-}

class Modular s a | s -> a where modulus :: s -> a

newtype M s a = M {unM :: a} deriving (Eq, Show)

normalize :: (Modular s a, Integral a) => a -> M s a
normalize x :: M s a = M (x `mod` (modulus (undefined :: s)))

我得到以下错误:

config1.hs:10:1: Parse error in pattern: normalize

你能帮忙吗?

埃里克·麦考利

normalize x :: M s a = -- ...

这是错误的。没有理由像这样在定义中声明返回类型,您已经在前面一行的类型签名中声明过了。事实上,它在语法上是无效的,这就是你得到解析错误的原因。

然而,一旦你修复了解析错误(通过删除:: M s a),它仍然不会工作,因为你实际上还没有使用作用域类型变量:

为了使用作用域类型变量扩展,需要使用forall关键字显式声明类型变量。固定的定义看起来像这样:

normalize :: forall s a. (Modular s a, Integral a) => a -> M s a
normalize x = M (x `mod` (modulus (undefined :: s)))

我想你想要的是:

normalize :: forall s a . (Modular s a, Integral a) => a -> M s a
normalize x = M (x `mod` (modulus (undefined :: s)))

注意,当你使用ScopedTypeVariables语言特性时,forall s a.在函数体中将类型变量sa带入作用域。

您尝试的语法从未被GHC支持。

相关内容

  • 没有找到相关文章

最新更新