因为我经常遇到这个问题,所以在纸上一切都应该有效,但是编译器会给出一个我无法理解的错误。
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]
答案 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]
与您期望的不同,它只与一个列表([[?]]
)匹配,只有一个元素(即列表)。最后,你必须递归函数,而不是数据类型。