我试图以列表形式(例如[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
Run Code Online (Sandbox Code Playgroud)
问题是当我尝试编译此代码时,我收到一个我不理解的错误:
期望一个类型,但'Num a'有类'GHC.Prim.Constraint'
在'apply' 的类型签名中:
apply :: Num a => Poly a - > Num a - > Num a
当你写作
apply :: Num a => Poly a -> Num a -> Num a
Run Code Online (Sandbox Code Playgroud)
第一个实例Num a
是约束,表示该类型a
必须符合Num
类型类.但是,一旦您指定了该约束,您就不需要再次这样做了.您遇到的问题是,当您应该使用该类型时,您在此行上使用约束 Num a
了几次.要解决您的问题,请将类型更改为以下内容: a
apply
apply :: Num a => Poly a -> a -> a
Run Code Online (Sandbox Code Playgroud)
非正式地说,类型签名之间::
和之间的东西=>
是约束,而右边的东西=>
需要是类型.(请注意,某些类型的签名不包含任何约束,在这种情况下,它们也不包括=>
分隔符.)