【问题标题】:Changing sequence function from foldr to recursive function将序列函数从折叠函数更改为递归函数
【发布时间】:2016-10-18 21:12:06
【问题描述】:

我正试图了解序列函数。我认为如果我把它写成一个递归函数可能会有所帮助,但考虑到它是一个单子表达式,我发现它有点难以转换为递归函数,所以我有点不知所措。我的意思是你如何处理 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)))

【问题讨论】:

  • 不清楚你在问什么。
  • 没有foldr的函数怎么写?
  • 没有我就不要写函数。 :(

标签: haskell


【解决方案1】:

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')

【讨论】:

  • 好的。将检查 Traversable。这就是我想要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-01
  • 2010-10-06
  • 2016-01-06
  • 2020-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多