gpt4 book ai didi

list - 如何获取包含在 monad 中的列表中的While 元素

转载 作者:行者123 更新时间:2023-12-02 02:52:11 24 4
gpt4 key购买 nike

有一个小难题,我想知道您是否可以帮我澄清一下。

让我们定义一个返回列表的函数:

let f = replicate 3

我们想要做的是将这个函数映射到一个无限列表,连接结果,然后只取与谓词匹配的东西。
takeWhile (< 3) $ concatMap f [1..]

伟大的!返回 [1,1,1,2,2,2] ,这就是我想要的。

现在,我想做类似的事情,但是函数 f 现在将其结果包装在 Monad 中。在我的用例中,这是 IO monad,但这适用于讨论我的问题:
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]

返回:只是 [1,1,1,2,2,2]。伟大的!

但是,如果我制作我映射无限列表的列表,这不会达到我的预期:
fmap (takeWhile (< 3) . concat) $ mapM f' [1..]

好像是 takeWhile永远不会发生。不知何故,我没有得到我期待的懒惰计算。我有点失落。

最佳答案

问题不在于 fmap + takeWhile不适用于包含在 monad 中的无限列表。问题是mapM不能产生一个无限列表(至少不在 Maybe monad 中)。

想一想:如果f'返回 Nothing对于列表中的任何项目,mapM必须返回Nothing .然而mapM直到它调用 f' 才能知道是否会发生这种情况。在列表中的所有项目上。所以它需要遍历整个列表才能知道结果是否为NothingJust .显然,这是无限列表的问题。

关于list - 如何获取包含在 monad 中的列表中的While 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4404351/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com