Функция непоследовательной монады в Haskell
У меня возникли некоторые реальные проблемы с разработкой контрфункции Хаскеллаsequence
функция, о которой мне говорит Google, еще не существует. Вот как это ведет себя:
ghci> sequence [Just 7, Just 8, Just 9]
Just [7,8,9]
ghci> sequence [getLine, getLine, getLine]
hey
there
stack exchange
["hey","there","stack exchange"] :: IO [String]
Моя проблема заключается в создании такой функции:
unsequence :: (Monad m) => m [a] -> [m a]
Так что он ведет себя так:
ghci> unsequence (Just [7, 8, 9])
[Just 7, Just 8, Just 9]
ghci> sequence getLine
hey
['h','e','y'] :: [IO Char] --(This would actually cause an error, but hey-ho.)
На самом деле я не знаю, возможно ли это, потому что в какой-то момент я бы избежал монады, но я начал, хотя и не знаю, как установить точку останова для этой рекурсивной функции:
unsequence m = (m >>= return . head) : unsequence (m >>= return . tail)
Я понимаю, что мне нужна точка останова, когдаm
здесь равноreturn []
но не все монады имеютEq
экземпляры, так как я могу это сделать? Это вообще возможно? Если так, то почему, а почему нет? Пожалуйста, скажи мне это.