ScopedTypeVariables有时在范围内,有时不在范围内

时间:2011-10-05 15:43:01

标签: haskell types scope parameterized

我正在试图找出我的类型参数何时在范围内。我觉得有两个相同的例子,但其中一个不起作用。

{-# LANGUAGE ScopedTypeVariables #-}
class IntegerAsType a where
  value :: a -> Integer   

class BaseRing a where
  primroot :: a -> Integer -> a

newtype Zq q = Zq Integer deriving (Eq)

instance (IntegerAsType q) => Num (Zq q) where
...
negate (Zq x) = Zq ((value (undefined :: q)) - x) --THIS WORKS

instance (IntegerAsType q) => BaseRing (Zq q) where
primroot = (xyz::(Zq q)) m = (value q)+m --(as an example), DOES NOT WORK

这两个实例之间有什么区别(为什么一个工作,一个不工作)?

我正在引用previous post,建议我将类型放在函数参数中。这在以前工作,但在这种情况下,省略参数的显式类型会给我带来同样的错误:

Not in scope 'q'

由于

1 个答案:

答案 0 :(得分:2)

q是一个类型变量,而不是常规变量。这就是为什么value (undefined :: q)有效而value q无效。