具有多个参数的递归函数Haskell
一个非常简单的问题:我想在Haskell中实现2个整数的乘法。 我写的东西没有编译:具有多个参数的递归函数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
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。这与您现在遇到的问题无关,但我认为这可能是未来的一个有用的补充说明,如果不是现在的话。如果它现在让人困惑,那么以后再忽略它,不要担心。哈哈,是的,我才意识到。。非常愚蠢的错误,虽然很容易发现:哈哈,是的,我才意识到。。非常愚蠢的错误,但很容易发现: