作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有一个小难题,我想知道您是否可以帮我澄清一下。
让我们定义一个返回列表的函数:
let f = replicate 3
takeWhile (< 3) $ concatMap f [1..]
[1,1,1,2,2,2]
,这就是我想要的。
let f' x = Just $ replicate 3 x
fmap concat $ mapM f' [1..5]
Just [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5]
takeWhile
,这仍然有效:
fmap (takeWhile (< 3) . concat) $ mapM f' [1..5]
fmap (takeWhile (< 3) . concat) $ mapM f' [1..]
takeWhile
永远不会发生。不知何故,我没有得到我期待的懒惰计算。我有点失落。
最佳答案
问题不在于 fmap
+ takeWhile
不适用于包含在 monad 中的无限列表。问题是mapM
不能产生一个无限列表(至少不在 Maybe monad 中)。
想一想:如果f'
返回 Nothing
对于列表中的任何项目,mapM
必须返回Nothing
.然而mapM
直到它调用 f'
才能知道是否会发生这种情况。在列表中的所有项目上。所以它需要遍历整个列表才能知道结果是否为Nothing
或 Just
.显然,这是无限列表的问题。
关于list - 如何获取包含在 monad 中的列表中的While 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4404351/
我是一名优秀的程序员,十分优秀!