gpt4 book ai didi

functional-programming - "flatMap"这个词是从哪里来的?

转载 作者:行者123 更新时间:2023-12-04 14:38:43 24 4
gpt4 key购买 nike

现在 flatMap 是对类似 monad 对象的通信操作最广泛使用的名称。
但我找不到它第一次出现在什么地方,又是什么普及了它。

我所知道的最古老的外观是在 Scala 中。
在 Haskell 中,它被称为 bind .
在范畴论中使用希腊符号。

最佳答案

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

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


  • 函数/方法名称 flatMap似乎是由 组成的混合词平十和 map .这是有道理的,因为每当 M是一些单子(monad), A , B某些类型,以及 a: M[A] , f: A => M[B]一个值和一个函数,然后是 map 的实现, flatMapflatten应该满足
    a.flatMap(f) = a.map(f).flatten

    (在 Scala 语法中)。

    让我们首先考虑这两个组件 mapflatten分别地。

    map
    map -function 似乎自远古以来就被用来映射列表。我最好的猜测是它来自 Lisp(大约 1958 年),然后传播到所有其他具有类似于高阶函数的语言。

    压平

    考虑到 Lisp 中有多少事物由列表表示,我假设 flatten也被用于列表处理。
    flatten的用法在 monads 的上下文中必须是最近的,因为 monads 本身是在很晚之后才被引入到编程中的。如果我们要在 monadic 计算的上下文中寻找“flatten”一词的用法,我们可能至少应该查看 Eugenio Moggi 的论文。确实,在 "Computational Lambda-Calculus and Monads"从 1988 年开始,他使用以下公式:

    Remark 2.2: Intuitively eta_A: A -> TA gives the inclusion of values into computations, while mu_A: T^2 A -> TA flatten a computation of a computation into a computation.



    (排版由我更改,强调我的,斜体文本与原始文本相同)。我认为有趣的是 Moggi 谈论扁平化计算,而不仅仅是列表。

    数学符号/“希腊语”

    关于数学符号中使用的希腊语:在范畴论中,引入单子(monad)的更常见方法是通过对应于 pure 的自然变换。和 flatten ,对应于 flatMap 的态射不被重视。然而,没有人称其为“扁平化”。例如,Maclane 调用方法 pure 对应的自然变换。 “单位”(不要与方法 unit 混淆)和 flatten通常称为“乘法”,类似于 Monoids。当“三重”术语更为普遍时,人们可能会进一步调查它是否有所不同。

    平面 map

    寻找起源 flatMap portmanteau 词,我建议从今天最突出的普及者开始,然后尝试从那里回溯。显然, flatMap is a Scala meme ,所以从 Scala 开始似乎是合理的。人们可能会检查常见嫌疑人的标准库(尤其是 List 数据结构):影响 Scala 的语言。这些“根”在 Odersky 的“Programming in Scala”的第 1 章第 1.4 节中命名:
  • C、C++ 和 C# 可能不是它的来源。
  • 在 Java 中,情况正好相反:flatMap从 Scala 到 Java 1.8 版。
  • 我对 Smalltalk 无话可说
  • ruby 绝对has flat_map Enumerable ,但我对 Ruby 一无所知,也不想钻研源代码去查明它是什么时候引入的。
  • Algol 和 Simula:绝对不是。
  • 奇怪的是 ML (SML) seems to get by without flatMap ,它只有concat (本质上与 flatten 相同)。 OCaml 的列表也seem to have flatten , but no flatMap .
  • 正如您已经提到的,Haskell 很久以前就有这一切,但在 Haskell 中它被称为 bind并写为运算符
  • Erlang has flatmap on lists ,但我不确定这是起源,还是后来引入的。 Erlang 的问题是它是 1986 年的,那时候还没有 github。
  • 我对 Iswim、Beta 和 gbeta 无话可说。

  • 我认为可以公平地说 flatMap Scala 已经普及,原因有二:
  • flatMap在 Scala 集合库的设计中发挥了重要作用,几年后它被证明可以很好地推广到大型分布式集合(Apache Spark 和类似工具)
  • flatMap成为所有决定在 JVM 上正确进行函数式编程的人的最爱(Scalaz 和受 Scalaz 启发的库,如 Scala Cats)


  • 总结一下:从一开始就在 monad 的上下文中使用“扁平化”术语。后来又和 map合并了进入 flatMap ,并由 Scala 推广,或更具体地说,由 Apache Spark 和 Scalaz 等框架推广。

    关于functional-programming - "flatMap"这个词是从哪里来的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49843262/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com