У меня возникли проблемы с конструированием функции Haskell sequence
, о которой говорит Hoogle, еще не существует. Это, как он ведет себя:Непоследовательность Функция Monad в 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]
Моя проблема делает функция, как это:
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
экземпляров, так как я могу это сделать? Возможно ли это? Если да, то почему и почему нет? Пожалуйста, скажи мне это.
Чтобы понять, почему это невозможно сделать в общем, рассмотрите что-то вроде 'do {b <- check; if b then list1 else list2} :: M [A] 'для какой-то конкретной монады' M' и некоторого конкретного типа 'A'. – Cactus