当我向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
你能帮忙吗?
Eric Macaulay
答案 0 :(得分:7)
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)))
答案 1 :(得分:4)
我认为你想要的是:
normalize :: forall s a . (Modular s a, Integral a) => a -> M s a
normalize x = M (x `mod` (modulus (undefined :: s)))
当您使用forall s a.
语言功能时,请注意s
将函数体中的类型变量a
和ScopedTypeVariables
置于范围内。
GHC从未支持您尝试过的语法。