Sto riscontrando qualche problema nella progettazione della funzione di controffunzione della funzione sequence
di Haskell, che Hoogle mi dice che non esiste ancora. Questo è come si comporta:Funzione Monad di conseguenza in Haskell
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]
Il mio problema sta facendo una funzione come questa:
unsequence :: (Monad m) => m [a] -> [m a]
modo che si comporti in questo modo:
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.)
io in realtà non so se è possibile, perché a un certo punto sarei scappato dalla monade, ma ho fatto un salto, anche se non so come impostare un breakpoint per questa funzione ricorsiva:
unsequence m = (m >>= return . head) : unsequence (m >>= return . tail)
mi rendo conto che ho bisogno di un punto di interruzione quando il m
qui è uguale a return []
, ma non tutte le monadi hanno Eq
casi, quindi come posso fare questo? È possibile? Se è così, perché e perché no? Per favore dimmelo
Per capire perché non può essere fatto in generale, prendere in considerazione qualcosa come 'do {b <- check; se b allora list1 else list2}: M [A] 'per alcuni monad in calcestruzzo' M' e alcuni tipi concreti 'A'. – Cactus