【问题标题】:Expected a type, but ‘Num a’ has kind ‘GHC.Prim.Constraint’期望一个类型,但“Num a”有一种“GHC.Prim.Constraint”
【发布时间】:2016-07-18 15:57:22
【问题描述】:

我正在尝试采用列表形式的多项式表示(例如 [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

【问题讨论】:

    标签: haskell types ghc


    【解决方案1】:

    当你写作时

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

    Num a 的第一个实例是一个约束,这意味着a 类型必须符合Num 类型类。但是,一旦您指定了该约束一次,您就不需要再这样做了。你遇到的问题是你在这条线上使用了 约束 Num a 多次,而你应该只使用 type a。要解决您的问题,请将apply 的类型更改为以下内容:

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

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

    【讨论】:

    • 谢谢你,就是这样!,当它允许我时我不接受
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2022-12-05
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    相关资源
    最近更新 更多