У меня есть следующий код из Проблема 26 проблем 99 Haskell:
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" сделать нотацию следующим образом:
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 на >>=
и >>
?