我是Haskell的新手,我對以下行爲感到困惑:爲什麼Haskell無法自動解析參數個數?
我有一個叫做dealWithIt的函數。它看起來像這樣:
dealWithIt :: (Show a) => [a] -> String
dealWithIt = foldl f ""
where f memo x = memo ++ (show x)
都好,它的工作如預期,它得到showables的列表,並將它們連接成一個字符串。
盡我所知,如果我明確指定收到的參數,只要它可以傳遞到底層的函數鏈,那並不重要。這意味着以下兩個定義應該是等效的:
dealWithIt xs = foldl f "" xs
dealWithIt = foldl f ""
到目前爲止這麼好。比方說,我想現在通過模式匹配添加一個特殊情況:
dealWithIt [] = "Empty list :("
這就是事情變得怪異。如果我沒有明確指定XS的說法,我得到以下錯誤:
Equations for ‘dealWithIt’ have different numbers of arguments
我可以住在一起,但它真的很有趣,我爲什麼Haskell中無法檢測到發生了什麼事,甚至會報告錯誤當兩種變體都只有一個參數?
'dealWithIt = foldl f「」'已經指定了所有可能參數的行爲。用另一個論點再次定義它有什麼意義? –
添加特例與處理所有可能的參數無關。 – qwe
編譯器拋出的錯誤消息說清楚了。這些是不同的功能。比較他們的簽名。如果您需要處理* special *參數,則可以使用參數模式匹配,但保留相同的類型。或者使用警衛,或者如果/情況條件。 – joanbm