1

当我向 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

你能帮我吗?

埃里克·麦考利

4

2 回答 2

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)))
于 2011-08-19T12:22:42.113 回答
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.将类型变量sa函数体中的范围。ScopedTypeVariables

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

于 2011-08-19T12:22:57.027 回答