Nowdays flatMap是对类似monad的对象进行相应操作的最广泛使用的名称。 但我无法找到它第一次出现的地方以及推广它的地方。
我所知道的最古老的外表是Scala。
在Haskell中,它被称为bind
。
在类别理论中使用希腊符号。
答案 0 :(得分:4)
部分答案,希望提供一些有用的种子节点"开始更彻底的搜索。我最好的猜测:
map
用于列表处理,flatten
用于monad的上下文,flatMap
用作支持for
的重要方法 - Scala中的理解。函数/方法名称flatMap
似乎是由 flat 十和 map 组成的portmanteau字。这是有道理的,因为每当M
是一些monad,A
,B
某些类型,a: M[A]
,f: A => M[B]
一个值和一个函数,那么实现map
,flatMap
和flatten
应满足
a.flatMap(f) = a.map(f).flatten
(在Scala语法中)。
我们首先分别考虑两个组件map
和flatten
。
<强>地图
自远古以来,map
- 函数似乎已用于映射列表。我最好的猜测是它来自Lisp(大约在1958年),然后传播到所有其他类似高阶函数的语言。
<强>平铺强>
考虑到Lisp中的列表表示了多少内容,我假设flatten
也用于列表处理。
在monad的上下文中使用flatten
必须更新,因为monad本身已经在编程中引入了很多。如果我们正在寻找单词&#34; flatten&#34;在monadic计算的背景下,我们至少应该检查Eugenio Moggi的论文。实际上,在1988年的"Computational Lambda-Calculus and Monads"中,他使用了这个表述:
备注2.2:直观
eta_A: A -> TA
将值包含在计算中,而mu_A: T^2 A -> TA
将计算计算计算。
(排版由我改变,强调我的,文本用斜体表示原文)。我认为Moggi谈论扁平化计算而不仅仅是列表是有趣的。
数学符号/&#34;希腊语&#34;
关于数学符号中使用的希腊语:在类别理论中,引入monad的更常见方式是通过与pure
和flatten
对应的自然变换,对应于{{1}的态射。被强调了。然而,没有人称它为“平坦”。例如,Maclane调用与方法flatMap
&#34;单位&#34;相对应的自然变换。 (不要与方法unit
混淆),pure
通常称为&#34;乘法&#34;,类似于Monoids。有人可能会进一步调查,当三联体的发生率更高时是否会有所不同。
<强> flatMap 强>
为了找到flatten
portmanteau词的起源,我建议从今天最杰出的推广者开始,然后尝试从那里回溯。显然,flatMap is a Scala meme,所以从Scala开始似乎是合理的。有人可能会检查常见嫌疑人的标准库(尤其是flatMap
数据结构):影响Scala的语言。这些&#34;根源&#34;在Odersky&#34; Scala编程&#34;的第1章第1.4节中命名:
List
来自Scala,进入Java 1.8版本。flat_map
flatMap
,但我对Ruby一无所知,我也不想深入了解源代码,以了解它何时推出flatMap
or flatten
。 OCaml列出了seem to have flatten
, but no flatMap
。Enumerable
并被编写为运算符flatmap
on lists,但我不确定这是否是原点,或者是否稍后介绍。 Erlang的问题在于它是从1986年开始的,当时没有github。我认为可以公平地说,bind
已被Scala推广,原因有两个:
flatMap
在Scala的集合库的设计中发挥了重要作用,几年后它最终很好地概括为大型分布式集合(Apache Spark和类似工具)flatMap
成为每个决定在JVM上正确进行函数式编程的人最喜欢的玩具(Scalaz和灵感来自Scalaz的库,如Scala Cats)总结一下:&#34;展平&#34;术语从一开始就用于monad的上下文中。后来,它与flatMap
结合到map
中,并由Scala推广,或者更具体地说是由Apache Spark和Scalaz等框架推广。
答案 1 :(得分:2)
flatmap
在“ 2.2.3序列作为常规接口在“计算机程序的结构和解释”中引入
(define (flatmap proc seq)
(accumulate append nil (map proc seq)))
这本书的第一版出现在1985年。