Функция непоследовательной монады в 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 экземпляры, так как я могу это сделать? Это вообще возможно? Если так, то почему, а почему нет? Пожалуйста, скажи мне это.

Ответы на вопрос(2)

Ваш ответ на вопрос