将序列函数从foldr更改为递归函数

时间:2016-10-18 11:30:40

标签: haskell

我正试图绕过序列函数。我认为如果我把它写成一个递归函数可能会有所帮助,但我有点不知道怎么做,因为它是一个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)))

1 个答案:

答案 0 :(得分:3)

撰写sequence的一种方法只是traverse id,我建议您探索TraversableApplicative之间的关系,以便更深入地理解。

我认为你要找的是这个定义:

sequence :: Monad m => [m a] -> m [a]
sequence [] = return []
sequence (x:xs) = do
  x' <- x
  xs' <- sequence xs
  return (x':xs')