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

Mar*_*ick 3 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
Run Code Online (Sandbox Code Playgroud)

问题是当我尝试编译此代码时,我收到一个我不理解的错误:

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

bde*_*ham 8

当你写作

apply :: Num a => Poly a -> Num a -> Num a
Run Code Online (Sandbox Code Playgroud)

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

apply :: Num a => Poly a -> a -> a
Run Code Online (Sandbox Code Playgroud)

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