Haskell无法编译

时间:2014-05-15 17:29:28

标签: haskell types polynomials

因为我经常遇到这个问题,所以在纸上一切都应该有效,但是编译器会给出一个我无法理解的错误。

data Polynom = Polynom[Double] 
           deriving Show



calcPolynom :: Double -> Polynom -> Double
calcPolynom _ [] = 0.0
calcPolynom _ Polynom [] = 0.0
calcPolynom n Polynom[h:ts] = h + n* Polynom[ts]

给出错误“构造函数`Polynom'应该有1个参数,但是没有给出”。 但我做了并且还要将其定义为空多项式。

有人可以帮忙吗?我对haskell真的很陌生,我真的很赞赏任何一种帮助:)

附加信息:我希望多项式是双打列表,即     2x³ - 1.4x²+ 2.5 = [2.5,0,-1.4,2]

2 个答案:

答案 0 :(得分:2)

您只需要一些括号并修复模式匹配:

calcPolynom _ (Polynom []) = 0.0
calcPolynom n (Polynom (h:ts)) = h + n * ???

我留下空白让你填写???,你必须弄明白应该去哪里而不是你现在拥有的东西。原因是你不能将Double类型的值与类型Polynom的值相乘,但你可以递归地写这个(我假设这是你的初衷) )。

当你有像

这样的代码时
calcPolynom n Polynom [h:ts] = ...

编译器发现calcPolynom有3个参数而Polynom没有,你用圆括号进行分组。

答案 1 :(得分:1)

calcPolynom _ (Polynom []) = 0.0
calcPolynom n (Polynom (h:ts)) = h + n * calcPolynom n (Polynom ts)

当您尝试对构造函数进行模式匹配时,必须将其括在括号中。这不仅适用于Polynom数据类型,也适用于列表。 [h:ts]与您期望的不同,它只与一个列表([[?]])匹配,只有一个元素(即列表)。最后,你必须递归函数,而不是数据类型。