gpt4 book ai didi

haskell - Haskell 中的 fmap 和 "flat map"

转载 作者:行者123 更新时间:2023-12-03 14:36:35 25 4
gpt4 key购买 nike

一直以来,当任何 Haskell 讲座谈到“平面 map ”时,通常与 Monads 相关,我认为它被称为“平面”是有原因的,即它使容器变平。所以

[[1,2],[3,4]]

将被处理,就好像它是
[1,2,3,4]

但是现在我发现 fmap 和 map 基本上是一回事,唯一的区别是一个用于仿函数,另一个用于列表。最后,这样做只是为了避免在使用 map 时混淆错误消息。

真的吗?如果是这样,为什么 f在 fmap 中意味着“平面”,为什么不是“仿函数图”?

最佳答案

And if so, why did f in fmap come to mean “flat”, why not “functor map”?



你的直觉是对的: ffmap 代表“仿函数 map ”,根本不是“平面 map ”。事实上,在较新的类似语言中,例如 PureScript,名称只是 map。 . Haskell map不过,它首先是为列表定义的,因此很难想出一个新名称。使用 Functor 的 F 是一个简单的选择,如果不是特别有创意的话。

讲师更可能指的是单子(monad)绑定(bind)函数 >>=。 .由于 x >>= f等价于 join (fmap f x) , 绑定(bind)有时也称为 flatMap在其他语言中。它具有您在列表中所期望的行为,例如:
> [1,2,3] >>= \x -> [x,x]
[1,1,2,2,3,3]

不过,重要的是要记住,这个“平面 map ”不会递归地展平到任意深度。事实上,如果没有一些复杂的类型类技巧,在 Haskell 中编写这样的函数是不可能的。自己尝试一下: flatten 的类型签名是什么?函数看起来像,甚至是直接在列表上运行的函数?
flatten :: ??? -> [a]
>>=功能比较简单:就像 fmap ,但每个输出元素都必须包含在仿函数中,并且 >>=将结果浅“扁平化”到单个包装器中。这个操作是 monad 的本质,这就是 >>= 的原因。函数位于 Monad类型类,但 fmapFunctor .

此答案取自对原始问题的一些评论,因此我已将其标记为社区 wiki。欢迎编辑和改进。

关于haskell - Haskell 中的 fmap 和 "flat map",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40025319/

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