gpt4 book ai didi

dictionary - map 与 mapM 行为

转载 作者:行者123 更新时间:2023-12-01 16:11:12 26 4
gpt4 key购买 nike

我正在查看 Real World Haskell 的 I/O 章节。书中另外 7 章没有讨论 Monad。也就是说,我对 I/O 的理解充其量是不完整的。

现在我正在尝试理解mapM函数。据我了解,该函数“执行”列表中的每个元素,该元素必须是一个“操作”(IO monad)。

没有意义的是 this example 。为什么对于相同的参数,mapM 返回的结果与 map 不同?

Prelude> map (\x -> [x]) [0, 1, 2][[0],[1],[2]]Prelude> mapM (\x -> [x]) [0, 1, 2][[0,1,2]]

最佳答案

As I understand it, the function "executes" each element in the list which must be an "action" (IO monad).

对于 IO 来说确实如此,但在您的代码示例中,您不使用 IO monad,而是使用列表 monad(您提供给 mapM 的函数返回一个列表 ([x]),不是 IO)。

mapM 定义为 mapM f as = 序列 (map f as)。如果 f 返回一个 IO,这意味着对于列表中的每个元素,它通过将 f 应用于该元素来构造一个 IO。然后,它将映射返回的 IO 列表转换为使用序列“包含”列表的 IO(因此,当您执行 IO 时,您将返回包含非 IO 值的列表)。

对于列表,这意味着它通过将 f 应用于 as 的每个元素来创建列表列表。然后,它使用 sequence 创建一个列表列表,其中包含获取列表列表中每个列表的一个元素的所有可能方法(例如 sequence [[1,2],[3, 4]] 返回[[1,3],[1,4],[2,3],[2,4]])。

关于dictionary - map 与 mapM 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3137162/

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