“flatMap”这个词来自哪里?

时间:2018-04-15 14:50:43

标签: functional-programming language-agnostic monads terminology history

Nowdays flatMap是对类似monad的对象进行相应操作的最广泛使用的名称。 但我无法找到它第一次出现的地方以及推广它的地方。

我所知道的最古老的外表是Scala。 在Haskell中,它被称为bind。 在类别理论中使用希腊符号。

2 个答案:

答案 0 :(得分:4)

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

  • 1958年用于map用于列表处理,
  • 1988 for flatten用于monad的上下文,
  • 2004 flatMap用作支持for的重要方法 - Scala中的理解。

函数/方法名称flatMap似乎是由 flat 十和 map 组成的portmanteau字。这是有道理的,因为每当M是一些monad,AB某些类型,a: M[A]f: A => M[B]一个值和一个函数,那么实现mapflatMapflatten应满足

a.flatMap(f) = a.map(f).flatten

(在Scala语法中)。

我们首先分别考虑两个组件mapflatten

<强>地图

自远古以来,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的更常见方式是通过与pureflatten对应的自然变换,对应于{{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节中命名:

  • C,C ++和C#可能不是它的来源。
  • 在Java中,反过来说:List来自Scala,进入Java 1.8版本。
  • 我无法谈论Smalltalk
  • Ruby绝对has flat_map flatMap,但我对Ruby一无所知,我也不想深入了解源代码,以了解它何时推出
  • Algol和Simula:绝对不是。
  • 奇怪的是ML(SML)seems to get by without flatMap or flatten。 OCaml列出了seem to have flatten, but no flatMap
  • 正如您已经提到的那样,Haskell很久以前就拥有了这一切,但在Haskell中它被称为Enumerable并被编写为运算符
  • Erlang has flatmap on lists,但我不确定这是否是原点,或者是否稍后介绍。 Erlang的问题在于它是从1986年开始的,当时没有github。
  • 我无法谈论Iswim,Beta和gbeta。

我认为可以公平地说,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年。