需要一个类型,但‘Num a’有种类‘GHC.Prim.Constraint’
Expected a type, but ‘Num a’ has kind ‘GHC.Prim.Constraint’
我正在尝试采用列表形式的多项式表示(例如 [3, 2, 1] 是 3x^2 + 2x + 1)并通过对多项式执行应用和 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
问题是当我尝试编译这段代码时,出现了一个我无法理解的错误:
Expected a type, but ‘Num a’ has kind ‘GHC.Prim.Constraint’
In the type signature for ‘apply’:
apply :: Num a => Poly a -> Num a -> Num a
写的时候
apply :: Num a => Poly a -> Num a -> Num a
Num a
的第一个实例是一个约束,这意味着类型 a
必须符合 Num
类型类。但是,一旦您指定了该约束一次,就不需要再次这样做。你遇到的问题是你在这条线上多次使用 constraint Num a
而你应该只使用 type a
。要解决您的问题,请将 apply
的类型更改为以下内容:
apply :: Num a => Poly a -> a -> a
通俗地说,类型签名中::
和=>
之间的东西是约束,而=>
右边的东西需要是类型。 (请注意,某些类型签名不包含任何约束,在这种情况下,它们也不包含 =>
分隔符。)
我正在尝试采用列表形式的多项式表示(例如 [3, 2, 1] 是 3x^2 + 2x + 1)并通过对多项式执行应用和 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
问题是当我尝试编译这段代码时,出现了一个我无法理解的错误:
Expected a type, but ‘Num a’ has kind ‘GHC.Prim.Constraint’
In the type signature for ‘apply’:
apply :: Num a => Poly a -> Num a -> Num a
写的时候
apply :: Num a => Poly a -> Num a -> Num a
Num a
的第一个实例是一个约束,这意味着类型 a
必须符合 Num
类型类。但是,一旦您指定了该约束一次,就不需要再次这样做。你遇到的问题是你在这条线上多次使用 constraint Num a
而你应该只使用 type a
。要解决您的问题,请将 apply
的类型更改为以下内容:
apply :: Num a => Poly a -> a -> a
通俗地说,类型签名中::
和=>
之间的东西是约束,而=>
右边的东西需要是类型。 (请注意,某些类型签名不包含任何约束,在这种情况下,它们也不包含 =>
分隔符。)