“ flatMap”一词从何而来?

sim*_*djo 6 language-agnostic monads history functional-programming terminology

如今,flatMap是类似monad的对象上对应操作的最广泛使用的名称。但是我找不到它第一次出现在哪里以及什么流行。

我知道的最古老的外观是在Scala中。在Haskell中称为bind。在类别理论中,使用希腊表示法。

Gri*_*sha 6

flatmap 在“计算机程序的结构和解释”的第 2.2.3 节作为常规接口的序列中介绍为

(define (flatmap proc seq)
  (accumulate append nil (map proc seq)))
Run Code Online (Sandbox Code Playgroud)

该书的第一版于 1985 年出版。

  • 正如书中提到的(https://mitpress.mit.edu/sites/default/files/sicp/full-text/book/book-ZH-15.html#footnote_Temp_194),“这种嵌套映射的方法David Turner 向 [SICP 的作者] 展示了这一点,他的语言 KRC 和 Miranda 提供了处理这些结构的优雅形式。本节中的示例(另见练习 2.42)改编自 Turner 1981。*那*是 1981 年的 [KRC](https://en.wikipedia.org/wiki/KRC) [论文](https://www.semanticscholar.org/paper/The-Future-of-Applicative-Programming-特纳/82284ddc305ab89e1442bb76b0483423a76a32c4)。 (2认同)
  • (续)其中讨论了使用“ZF 表达式”(即列表推导式)*使用嵌套生成器* 来解决回溯问题——这意味着 `concatMap`ping。 (2认同)

And*_*kin 5

部分答案,希望可以提供一些有用的“种子节点”以开始更彻底的搜索。我最好的猜测:

  • 1958年map用于列表处理,
  • 1988年,flatten用于单子目录,
  • 2004年flatMap作为forScala中重要的方法-backup -comprehensions。

函数/方法的名称flatMap似乎是从组成混成词平坦地图。这是有意义的,因为每当M一些单子,AB某些类型的,并且a: M[A]f: A => M[B]一个值和一个函数,那么的实施方式mapflatMapflatten应满足

a.flatMap(f) = a.map(f).flatten
Run Code Online (Sandbox Code Playgroud)

(使用Scala语法)。

让我们首先考虑的两个组件mapflatten分开。

地图

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节中被命名:

  • C,C ++和C#可能不是它的来源。
  • 在Java中则是相反的情况:flatMapScala是Java的1.8版。
  • 关于Smalltalk我无话可说
  • Ruby肯定已经flat_map启用了Enumerable,但是我对Ruby一无所知,也不想深入研究源代码以了解何时引入。
  • Algol和Simula:绝对不是。
  • 奇怪的是,没有flatMap或的情况下,flatten足够的ML(SML)似乎无法实现。OCaml的清单似乎有flatten,但没有flatMap
  • 正如您已经提到的,Haskell在很久以前就拥有所有这些,但是在Haskell中,它是bind作为运算符进行调用和编写的
  • 二郎神flatmap列表上的,但我不知道这是否是原产地,它还是后来推出。Erlang的问题在于它是从1986年开始的,那时还没有github。
  • 关于Iswim,Beta和gbeta我什么也不能说。

我认为可以说,flatMap它已经被Scala普及了,原因有两个:

  • flatMap参加了Scala的集合库的设计突出的作用,而几年后,它变成了很好地推广到巨大的分布式集合(Apache的Spark和类似的工具)
  • flatMap成为大家最喜爱的玩具谁决定做函数式编程的JVM正确(Scalaz和Scalaz启发库,比如Scala猫)

总结一下:从一开始就在monads的上下文中使用了“ flatten”术语。后来,它与结合mapflatMap,并由Scala或更广泛地由Apache Spark和Scalaz之类的框架推广。