[英]Recursive functions with multiple arguments Haskell
一個非常簡單的問題:我想在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'
我不知道為什么編譯器在明確返回Int -> Int
時會說mult
返回Int -> Int
Int
。
您必須將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-1 y
讀為((-) (mult x) y)
。 函數應用程序在Haskell中的綁定非常緊密,因此有時使用太多的括號而不是太多的括號會更好,特別是在您仍在學習該語言的基礎時。
發生錯誤是因為(mult x)
的類型是Int -> Int
但是y
的類型是Int
,並且您不能減去這兩件事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.