在Haskell中使用词法范围的类型变量解析错误

时间:2011-08-19 12:14:51

标签: haskell parse-error type-variables

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

2 个答案:

答案 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将函数体中的类型变量aScopedTypeVariables置于范围内。

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