我正试图绕过序列函数。我认为如果我把它写成一个递归函数可能会有所帮助,但我有点不知道怎么做,因为它是一个monadic表达式,我觉得有点难以转换为递归。我的意思是你用return做什么(x:xs)?换句话说,我想编写没有foldr的函数。我在下面列出了两个定义:
sequence _ = foldr k (return [])
where
k m m' = do { x <- m; xs <- m'; return (x:xs) }
sequence' _ = foldr k (return [])
where
k m m' = m >>=
(\fstr -> m'>>=
(\rstr -> return (fstr:rstr)))
答案 0 :(得分:3)
撰写sequence
的一种方法只是traverse id
,我建议您探索Traversable
和Applicative
之间的关系,以便更深入地理解。
我认为你要找的是这个定义:
sequence :: Monad m => [m a] -> m [a]
sequence [] = return []
sequence (x:xs) = do
x' <- x
xs' <- sequence xs
return (x':xs')