期待一种类型,但'Num a'有种'GHC.Prim.Constraint'

时间:2016-07-18 15:57:23

标签: haskell types ghc

我尝试以列表形式(例如[3,2,1]为3x ^ 2 + 2x + 1)进行多项式表示并通过对多项式执行apply和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

问题是当我尝试编译此代码时,出现了一个我不明白的错误:

  

期望一种类型,但'Num a'有种'GHC.Prim.Constraint'       在“申请”的类型签名中:
        apply :: Num a => Poly a - > Num a - > Num a

1 个答案:

答案 0 :(得分:8)

写作时

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

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

apply

非正式地说,类型签名中apply :: Num a => Poly a -> a -> a ::之间的内容是约束,而=>右侧的内容需要是类型。 (请注意,某些类型的签名不包含任何约束,在这种情况下,它们也不会包含=>分隔符。)