13
我有以下代碼的99個哈斯克爾問題Problem 26:爲什麼當我試圖解除它時,我的Haskell do-notation會打破?
combinations :: Int -> [a] -> [[a]]
combinations 0 _ = return []
combinations n xs = do y:xs' <- tails xs
ys <- combinations (n-1) xs'
return (y:ys)
上面的代碼按預期工作。下面是我的主要功能和打印效果:
main = print $ combinations 2 "abcd"
-- Prints: ["ab","ac","ad","bc","bd","cd"]
作爲一個學習鍛鍊我試圖"desugar" the do-notation像這樣:
combinations :: Int -> [a] -> [[a]]
combinations 0 _ = return []
combinations n xs = tails xs >>= \(y:xs') ->
do
ys <- combinations (n-1) xs'
return (y:ys)
這將編譯,但在運行時提供了以下錯誤:
PatternMatchFail: /home/.../test.hs:(46,34)-(49,37): Non-exhaustive patterns in lambda
這是怎麼回事?我怎樣才能用>>=
和>>
代替do not notation?
作爲一個初學者,我覺得現在的「它只是語法糖」是有害的,所有這些說法。我知道這在技術上是真實的,但我已經多次向我提過,符號僅僅是限制>> =和>>我必須寫的數量。 – Buttons840
@ Buttons840它僅僅是一種便利,只是比你想象的多一點而已。 –
@ Buttons840它_is_語法糖。沒有符號,它不會做任何你無法做到的魔法。 – Cubic