Haskell 应为类型,但‘;数字a’;有种‘;GHC.Prim.Constraint’;

Haskell 应为类型,但‘;数字a’;有种‘;GHC.Prim.Constraint’;,haskell,types,ghc,Haskell,Types,Ghc,我试图以列表形式获取多项式表示(例如,[3,2,1]是3x^2+2x+1),并通过对多项式和x的数字执行apply来计算它。该多项式将被计算为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 w

我试图以列表形式获取多项式表示(例如,[3,2,1]是3x^2+2x+1),并通过对多项式和x的数字执行apply来计算它。该多项式将被计算为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”
在“应用”的类型签名中:
应用::Num a=>Poly a->Num a->Num a

当你写作时

apply :: Num a => Poly a -> Num a -> Num a
Num a
的第一个实例是一个约束,这意味着类型
a
必须符合
Num
typeclass。但是,一旦指定了该约束一次,就不需要再这样做了。您遇到的问题是,您在这一行中多次使用约束
Num a
,而您应该只使用类型
a
。要解决您的问题,请将
apply
的类型更改为:

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

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

谢谢,就是这样!,如果允许的话,我会接受的