sim*_*djo 6 language-agnostic monads history functional-programming terminology
如今,flatMap是类似monad的对象上对应操作的最广泛使用的名称。但是我找不到它第一次出现在哪里以及什么流行。
我知道的最古老的外观是在Scala中。在Haskell中称为bind。在类别理论中,使用希腊表示法。
flatmap 在“计算机程序的结构和解释”的第 2.2.3 节作为常规接口的序列中介绍为
(define (flatmap proc seq)
(accumulate append nil (map proc seq)))
Run Code Online (Sandbox Code Playgroud)
该书的第一版于 1985 年出版。
部分答案,希望可以提供一些有用的“种子节点”以开始更彻底的搜索。我最好的猜测:
map用于列表处理,flatten用于单子目录,flatMap作为forScala中重要的方法-backup -comprehensions。函数/方法的名称flatMap似乎是从组成混成词平坦十地图。这是有意义的,因为每当M一些单子,A,B某些类型的,并且a: M[A],f: A => M[B]一个值和一个函数,那么的实施方式map,flatMap并flatten应满足
a.flatMap(f) = a.map(f).flatten
Run Code Online (Sandbox Code Playgroud)
(使用Scala语法)。
让我们首先考虑的两个组件map和flatten分开。
地图
map自远古以来,-function似乎已用于映射列表。我最好的猜测是它来自Lisp(大约在1958年),然后传播到所有其他具有类似高阶函数的语言。
展平
鉴于Lisp中的列表代表了多少东西,我认为flatten那里也曾用于列表处理。
flattenmonad上下文中的用法必须是最近的,因为monad本身已在以后的编程中引入。如果在单子计算的上下文中寻找“变平”一词的用法,我们可能至少应该检查Eugenio Moggi的论文。实际上,在1988年的“计算Lambda微积分和Monads”中,他使用的公式是:
备注2.2:直观地
eta_A: A -> TA将值包含在计算中,同时将计算的计算mu_A: T^2 A -> TA平化为计算。
(字体由我更改,重点是我的字体,斜体为原文)。我认为Moggi谈论展平计算很有趣,而不仅仅是列表。
数学符号/“希腊语”
关于数学表示法中使用的希腊语:在范畴论中,引入单子词的更常见方法是通过与pure和对应的自然变换,而对与flatten对应flatMap的变态不再强调。但是,没有人称其为“扁平化”。例如,Maclane将与方法pure“ unit” 相对应的自然变换(不要与method混淆unit),flatten通常称为“乘法”,类似于Monoids。当“三重”术语更为普遍时,人们可能会进一步调查这是否有所不同。
flatMap
为了找到flatMapportmanteau单词的起源,我建议先从当今最著名的推广者开始,然后再尝试从那里撤回。显然,flatMap是一个Scala meme,因此从Scala开始似乎是合理的。人们可能会检查List常见嫌疑人的标准库(尤其是数据结构):影响Scala的语言。这些“根”在Odersky的“在Scala中编程”的第1章第1.4节中被命名:
flatMapScala是Java的1.8版。flat_map启用了Enumerable,但是我对Ruby一无所知,也不想深入研究源代码以了解何时引入。flatMap或的情况下,flatten足够的ML(SML)似乎无法实现。OCaml的清单似乎有flatten,但没有flatMap。bind作为运算符进行调用和编写的flatmap列表上的,但我不知道这是否是原产地,它还是后来推出。Erlang的问题在于它是从1986年开始的,那时还没有github。我认为可以说,flatMap它已经被Scala普及了,原因有两个:
flatMap参加了Scala的集合库的设计突出的作用,而几年后,它变成了很好地推广到巨大的分布式集合(Apache的Spark和类似的工具)flatMap成为大家最喜爱的玩具谁决定做函数式编程的JVM正确(Scalaz和Scalaz启发库,比如Scala猫)总结一下:从一开始就在monads的上下文中使用了“ flatten”术语。后来,它与结合map成flatMap,并由Scala或更广泛地由Apache Spark和Scalaz之类的框架推广。