我尝试以列表形式(例如[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
答案 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
和::
之间的内容是约束,而=>
右侧的内容需要是类型。 (请注意,某些类型的签名不包含任何约束,在这种情况下,它们也不会包含=>
分隔符。)