【发布时间】:2018-09-25 08:44:04
【问题描述】:
如今 flatMap 是对类 monad 对象进行对应操作的最广泛使用的名称。 但我找不到它第一次出现在哪里,又是什么让它流行起来的。
我所知道的最古老的外观是在 Scala 中。
在 Haskell 中,它被称为 bind。
在范畴论中使用希腊符号。
【问题讨论】:
-
列表版本在 Haskell 中称为
concatMap,因为它是concat . map。在 Scala(以及其他)中,concat被称为flatten,所以flatMap有意义。 -
@sepp2k 感谢您的回复。我明白这个词的意思。我对这里的历史概览感兴趣。
-
如果您将
flatMap替换为map,您将得到一个列表列表。如果你flatten得到结果,你会得到来自flatMap的结果。map存在于 60 年代的 Lisp 和一个变体中,maplist在 58 的原始 lisp 论文中。在 CL 中,flatMap被称为mapcan,CLHS 解释它与(apply #'nconc (mapcar f x1 ... xn))相同。因此,在名称中使用flatten或concat仅表明用户将列表视为数据或参数。 -
@Sylwester 在不相关的切线上,我曾经尝试过
(mapcon #'(lambda (x) x) (list 1 2 3))。你能不试就知道它的作用吗? /只是为了好玩/ -
@WillNess 在第一次迭代之后你有
(1 2 3),第二次之后它是(1 . #1=(2 3 . #1#)),它会停留一段时间,同时它试图到达最后一对以应用下一个:-p Btw我想我说mapcan是flatMap有点快,因为flatMap本质上可能没有破坏性。
标签: functional-programming language-agnostic monads terminology history