【发布时间】:2014-12-07 13:04:06
【问题描述】:
我在设计 Haskell 的 sequence 函数的反函数时遇到了一些真正的麻烦,Hoogle 告诉我它还不存在。这是它的行为方式:
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.)
我实际上不知道这是否可能,因为我会在某个时候转义 monad,但我已经开始了,虽然我不知道如何为这个递归函数设置断点:
unsequence m = (m >>= return . head) : unsequence (m >>= return . tail)
我意识到当这里的m 等于return [] 时我需要一个断点,但并不是所有的单子都有Eq 实例,那么我该怎么做呢?这甚至可能吗?如果是这样,为什么和为什么不呢?请告诉我。
【问题讨论】:
-
要了解为什么它不能在一般情况下完成,请考虑类似
do { b <- check; if b then list1 else list2 } :: M [A]的一些具体 monadM和一些具体类型A。
标签: list function haskell monads reverse