我正在试图找出我的类型参数何时在范围内。我觉得有两个相同的例子,但其中一个不起作用。
{-# 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'
由于
答案 0 :(得分:2)
q
是一个类型变量,而不是常规变量。这就是为什么value (undefined :: q)
有效而value q
无效。