当我向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.
在函数体中将类型变量s
和a
带入作用域。
您尝试的语法从未被GHC支持。