Função Monad de seqüência dentro de Haskell
Estou tendo alguns problemas reais para projetar a contra-função de Haskellsequence
função, que Hoogle me diz ainda não existe. É assim que se comporta:
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]
Meu problema é criar uma função como esta:
unsequence :: (Monad m) => m [a] -> [m a]
Para que se comporte assim:
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.)
Na verdade, não sei se isso é possível, porque eu estaria escapando da mônada em algum momento, mas comecei, embora não saiba como definir um ponto de interrupção para essa função recursiva:
unsequence m = (m >>= return . head) : unsequence (m >>= return . tail)
Percebo que preciso de um ponto de interrupção quando om
aqui é igual areturn []
, mas nem todas as mônadas têmEq
instâncias, então como posso fazer isso? Isso é possível? Se sim, por que e por que não? Por favor me diga isso.