需要一个类型,但‘Num a’有种类‘GHC.Prim.Constraint’

Expected a type, but ‘Num a’ has kind ‘GHC.Prim.Constraint’

我正在尝试采用列表形式的多项式表示(例如 [3, 2, 1] 是 3x^2 + 2x + 1)并通过对多项式执行应用和 x 的数字来评估它.将为 x 计算多项式。

这是我的代码:

newtype Poly a = P [a]

apply :: Num a => Poly a -> Num a -> Num a
apply (P p) x = if (i > 0) then (x * ((head p) ^ i)) + (apply (P (tail p)) x) else p
    where  i = length p

问题是当我尝试编译这段代码时,出现了一个我无法理解的错误:

Expected a type, but ‘Num a’ has kind ‘GHC.Prim.Constraint’
In the type signature for ‘apply’:
apply :: Num a => Poly a -> Num a -> Num a

写的时候

apply :: Num a => Poly a -> Num a -> Num a

Num a 的第一个实例是一个约束,这意味着类型 a 必须符合 Num 类型类。但是,一旦您指定了该约束一次,就不需要再次这样做。你遇到的问题是你在这条线上多次使用 constraint Num a 而你应该只使用 type a。要解决您的问题,请将 apply 的类型更改为以下内容:

apply :: Num a => Poly a -> a -> a

通俗地说,类型签名中::=>之间的东西是约束,而=>右边的东西需要是类型。 (请注意,某些类型签名不包含任何约束,在这种情况下,它们也不包含 => 分隔符。)