haskell - J/K/APL 如何按照通用范式进行分类?

标签 haskell language-agnostic functional-programming j paradigms

我刚开始学习 J,这很有趣,但我想知道它到底是一种什么样的语言,与常见的范式和分类有关。例如,您可以说 F# 是一种强类型,主要是函数式(它支持 OO 和过程编程,但它被认为是“函数式”)语言,属于 ML 家族。然而,对于 J,我找不到太多关于如何“按常规”对其进行分类的信息,或者在 Stackoverflow 上找不到任何东西来确认它是一种函数式编程语言。维基百科说它“是一种非常简洁的数组编程语言”、“支持函数级编程”、“不是冯诺依曼编程语言”,没有一个比这更有帮助。

我有一些问题:

  • J/K/APL 属于什么主要范式(程序、OO、功能、逻辑)?如果他们的范式只是“数组编程”,那么它属于或最相似的范式是什么?
  • J/K/APL 与哪些著名的编程语言最相似?例如,我猜它们就像 Lisp,因为它们对数组(列表)进行操作并且具有最小的、没有逗号的语法。

  • 我只是想根据我已经知道的对这些语言进行分类。谢谢你。

    最佳答案

    J 与 John Backus 提倡的那种函数式编程(有时称为函数级编程,而不是值级编程)有关,他可能更为人所知的是 Fortran 的发明者,但他在职业生涯的后半段试图使编程远离 Fortran 使用的风格。

    在他的Turing Award Lecture题为“编程可以从冯诺依曼风格中解放出来吗?”巴科斯概述了他的想法,并在他的 中进行了实验。 FP 佛罗里达 语言。这些灵感主要来自 Ken Iverson 的 APL ,而艾弗森在开发 时又借鉴了巴库斯的语言。 J .

    这些背后的关键思想是编程代数的形成,随着语言家族的发展而扩展和发展成为一种范式。使用这些代数工具,程序员可以通过根据众所周知的数学规则组合标准的高阶函数来导出或计算一个正确的程序来解决问题。从上面讲座的摘要:

    Associated with the functional style of programming is an algebra of programs whose variables range over programs and whose operations are combining forms. This algebra can be used to transform programs and to solve equations whose "unknowns" are programs in much the same way one transforms equations in high school algebra. These transformations are given by algebraic laws and are carried out in the same language in which programs are written. Combining forms are chosen not only for their programming power but also for the power of their associated algebraic laws. General theorems of the algebra give the detailed behavior and termination conditions for large classes of programs.



    尽管最近似乎没有很多研究使用这个语言家族的符号,但关键思想已经在其他函数式语言中有所发展。 Richard Bird 和 Lambert Meertens 研究了一种相关的形式,用于代数操作和程序及其操作数据的推导;这被称为 Bird-Meertens 形式主义,或者非正式地,斯奎戈 .

    Bird 和 Philip Wadler 后来写了一篇文章《函数式编程导论》,向学生介绍了更为著名的基于 lambda 演算的“值(value)级”函数式编程。它最初使用 米兰达 编程语言, 的先驱 haskell ,但在其第 2 版中被翻译为使用 haskell .我提到这一点是因为 Erik Meijer、Maarten Fokkinga 和 Ross Paterson 在他们著名的论文 "Functional Programming with Bananas, Lenses, Envelopes, and Barbed Wire" 中使用了文本中的示例函数作为激励示例。 ,在那里他们扩展了 Bird-Meertens 形式主义,为它提供了范畴论的基础,并展示了如何根据形式主义的定律和由其高阶函数捕获的递归方案来计算每个示例的解决方案。

    这些想法在 Haskell 中 Root ,在那里你可以找到一种被称为“无点”的编程风格,它与 非常相似。 FP 编程。它避开了命名变量,并纯粹通过组合其他函数来创建一个新函数。大多数语言都没有针对这种用途进行优化,因此仅使用标准库以无点样式创建许多函数很尴尬,但是提供更多 Squiggol 样式组合函数的替代库是可用的。

    由于其数学性质,构建程序的代数风格可以通过复杂的编译器进行高级分析和转换。这导致了函数式语言编译器中“融合”或“森林砍伐”优化的发展,允许以这种风格表达的算法被简化为高效的机器代码循环,而没有更天真的翻译所需的所有垃圾数据和冗余循环。今年早些时候,generalized stream fusion 的框架展示了这种编程风格的非常实用的结果。

    希望这个背景能让您更好地了解 Wikipedia 文章所讨论的内容以及底层范式是如何工作的。

    关于haskell - J/K/APL 如何按照通用范式进行分类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20558170/

    相关文章:

    functional-programming - 函数式编程依赖项: How to share dependencies between functions that aren't connected together direct

    haskell - Haskell 分析中星号的含义?

    haskell - fay生成文件的大小

    python - 这种计算并集和交集的编程方法的正式名称

    language-agnostic - 什么是可微分编程?

    python - 通常使用 lambda 函数作为字符串过滤 Python 对象数组中的值

    haskell - 如何连接两个 Haskell IO monad

    haskell - 我可以用 Applicative 而不是 Monad 重写这个类似 unionWith 的函数吗?

    language-agnostic - 2D运动模糊解决方案

    haskell - C++11 相当于 Haskell 的 "inits"