具有多个参数Haskell的递归函数

时间:2014-04-21 23:10:48

标签: haskell recursion multiplication

一个非常简单的问题:我想在Haskell中实现2个整数的乘法运算。 我写的不编译:

mult :: Int -> Int -> Int

mult x 1 = x

mult 1 y = y

mult x y = x + (mult x-1 y)

问题是最后一个声明。我试过把它写成:

mult x y = x + (mult x-1 y)

以及

mult x y = x + (mult(x-1,y))

我得到的错误是:

   Couldn't match expected type `Int' with actual type `Int -> Int'
    In the return type of a call of `mult'

我不知道为什么编译器会在mult明确返回Int -> Int时返回Int时说{。}}。

3 个答案:

答案 0 :(得分:4)

您必须将x-1放入括号中!像这样

mult x y = x + (mult (x-1) y)

顺便说一句,这不计算x和y的乘法:-) 尝试一些例子......这只是一个小错误。

答案 1 :(得分:4)

mult x y = x + (mult x-1 y)

括号内的表达式解析为:

(mult x) - (1 y)

因此编译器认为(-)的第一个参数是mult x,这是一个Int -> Int函数,因为只传递一个参数(而不是两个)。相反,你想要:

mult x y = x + mult (x-1) y

答案 2 :(得分:0)

这是一个简单的解析器问题。当您的意思是mult x-1 y时,编译器将((-) (mult x) y)读为mult (x-1) y。函数应用程序在Haskell中绑定得非常紧密,因此有时候使用太多括号而不是太少,尤其是当你还在学习语言的基础时。

发生错误的原因是(mult x)的类型为Int -> Int,但y的类型为Int,您无法减去这两件事。