【发布时间】:2017-02-22 19:58:55
【问题描述】:
一直以来,当任何 Haskell 讲座谈到“平面地图”时,通常与 Monad 相关,我认为它被称为“平面”是有原因的,即它会使容器变平。所以
[[1,2],[3,4]]
会像处理它一样处理
[1,2,3,4]
但现在我发现 fmap 和 map 基本上是一回事,唯一的区别是一个用于仿函数,另一个用于列表。最后,这样做只是为了避免在使用地图时混淆错误消息。
这是真的吗?如果是这样,为什么 fmap 中的 f 表示“平面”,为什么不是“函子映射”?
【问题讨论】:
-
f中的fmap并不意味着flat。 Haskell 中flatMap的等价物是(>>=)。列表的map函数是首先定义的,因此更通用的fmap函数需要另一个名称。 -
相反,
fmap是map对列表函子以外的其他函子的推广。谁告诉你fmap是flat map的缩写是错误的。 -
你确定你提到的讲座在说“平面地图”时指的是
fmap吗?如果它指的是concatMap(又名>>=)会更有意义,在其他语言中通常称为flatMap,并且其行为方式符合您的预期。 -
@trans
[1,2,3] >>= \x -> [x,x] -
展平是最后执行的,而不是第一个。在
[[1,2],[3,4]] >>= \x -> [x]中,我们获取列表的每个元素并将其绑定到x(因此x=[1,2]和x=[3,4]),然后我们将函数\x->[x]应用于每个x,得到结果列表[ [[1,2]], [[3,4]] ].最后,我们将最后一个列表展平为结果:[[1,2],[3,4]]。
标签: haskell