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

具有多个参数的递归函数Haskell,haskell,recursion,multiplication,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 t

一个非常简单的问题:我想在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。这是一个简单的解析器问题。编译器将mult x-1y读取为-mult x y,而您的意思是mult x-1y。函数应用程序在Haskell中绑定得非常紧密,所以有时最好使用太多而不是太少的括号,尤其是在您仍在学习该语言的基础知识时


发生此错误是因为mult x的类型是Int->Int,而y的类型是Int,并且不能减去这两个值。

这是一个简单的解析器问题。编译器将mult x-1y读取为-mult x y,而您的意思是mult x-1y。函数应用程序在Haskell中绑定得非常紧密,所以有时最好使用太多而不是太少的括号,尤其是在您仍在学习该语言的基础知识时

发生错误是因为mult x的类型是Int->Int,而y的类型是Int,并且不能减去这两个值。

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

mult x y = x + (mult (x-1) y)
顺便说一下,这不会计算x和y的乘法:- 尝试一些例子。。。这只是一个小错误。

你必须把x-1放在括号里!像这样

mult x y = x + (mult (x-1) y)
顺便说一下,这不会计算x和y的乘法:- 尝试一些例子。。。这只是一个小错误。

mult x y = x + (mult x-1 y)
括号内的表达式解析为:

(mult x) - (1 y)
因此编译器认为-的第一个参数是mult x,这是一个Int->Int函数,因为只传递了一个参数而不是两个。相反,您希望:

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

括号内的表达式解析为:

(mult x) - (1 y)
因此编译器认为-的第一个参数是mult x,这是一个Int->Int函数,因为只传递了一个参数而不是两个。相反,您希望:

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

当您将mult应用于一个参数时,比如这个mult5,您会得到Int->Int类型的东西,因为您已经将它部分应用于一个参数。很明显,您有mult5::Int->Int。这与您现在遇到的问题无关,但我认为这可能是未来的一个有用的补充说明,如果不是现在的话。如果它现在让人困惑,请稍后忽略它,不要担心。当您将mult应用于一个参数时,如mult5,您会得到Int->Int类型的内容,因为您已经将它部分应用于一个参数。很明显,您有mult5::Int->Int。这与您现在遇到的问题无关,但我认为这可能是未来的一个有用的补充说明,如果不是现在的话。如果它现在让人困惑,那么以后再忽略它,不要担心。哈哈,是的,我才意识到。。非常愚蠢的错误,虽然很容易发现:哈哈,是的,我才意识到。。非常愚蠢的错误,但很容易发现: