一个非常简单的问题:我想在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
时说{。}}。
答案 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
,您无法减去这两件事。