“功能编程”有明确的含义,但是“功能语言”呢?

时间:2010-02-18 19:54:37

标签: functional-programming scheme

我非常清楚功能和命令式编程技术之间的区别。但是人们普遍倾向于谈论“功能语言”,这真让我感到困惑。

当然,像Haskell这样的语言比其他语言(如C语言)更能热衷于函数式编程。但即使前者也使用I / O(它只是将它保存在贫民区)。你可以用C编写功能程序(这简直太荒谬了)。所以也许只是程度问题。

尽管如此,即使是程度问题,当有人称Scheme为“功能语言”时,它意味着什么?我看到的大多数Scheme代码都是必不可少的。如果你愿意的话,只是Scheme可以很容易地用函数式编写吗? Lua和Python也是如此。它们也是“功能语言”吗?

我(真的)不想成为一名语言警察。如果这只是一种松散的谈话方式,那很好。我只想弄清楚它是否确实有一些明确的含义(即使这是一个程度问题的意义),我没有看到。

10 个答案:

答案 0 :(得分:16)

在以编程语言为生的人中,“函数式编程语言”是一个相当弱的术语。有一个强烈的共识:

  • 任何自称功能的语言都必​​须支持 first-class,带有词法作用域规则的嵌套函数

重要的少数群体还为以下语言保留“功能语言”一词:

,如Agda,Clean,Coq和Haskell等语言。

除此之外,被认为是函数式编程语言通常是 intent 的问题,也就是说,设计师是否希望将称为“功能”。

Perl和Smalltalk是支持一流功能但其设计者不会将其称为功能的语言示例。目标Caml是一种被称为功能的语言示例,即使它具有带继承和所有内容的完整对象系统。

被称为“功能性”的语言倾向于具有以下功能(取自Defining point of functional programming):

特定编程语言越具有语法和结构,以使上面列出的各种编程特征容易/轻松地表达和表达。实施,更有可能有人将其标记为“功能语言”。

答案 1 :(得分:12)

我想说功能语言是任何允许函数式编程而没有过度痛苦的语言。

答案 2 :(得分:9)

我喜欢@Randolpho的回答。关于功能,我可以在这里列出这个列表:

Defining point of functional programming

  • 纯度(a.k.a。不变性,避免副作用,参考透明度
  • 高阶函数(例如,将函数作为参数传递,将其作为结果返回,动态定义匿名函数作为lambda表达式)
  • 懒惰(a.k.a。非严格评估,与纯度相结合时最有用/可用)
  • 代数数据类型模式匹配
  • 闭包
  • 结束 / 部分申请
  • 参数多态(a.k.a。泛型
  • 递归(由于纯度更突出)
  • 使用表达式而不是语句进行编程(再次,来自纯度)

特定的编程语言具有更多的语法和结构,以使上面列出的各种FP特征容易/轻松地表达和表达。实施,更有可能有人将其标记为“功能语言”。

答案 3 :(得分:4)

Jane Street的Brian Hurt在此前写了very good article。他得出的基本定义是函数式编程语言是一种模拟lambda演算的语言。想想哪些语言被广泛认可是有用的,你会发现这是一个非常实用的定义。

Lisp是对lambda演算进行建模的原始尝试,因此它符合这个定义 - 尽管由于大多数实现都没有非常贴近lambda演算的思想,所以它们通常被认为是混合范式或者最多弱功能。

这也是为什么许多人对像Python这样被称为功能的语言感到愤怒的原因。 Python的一般哲学与lambda演算无关 - 它根本不鼓励这种思维方式 - 因此它不是一种函数式语言。它是具有一流功能的图灵机。你可以在Python中进行函数式编程,是的,但语言并没有与函数式语言相同的数学运算。 (顺便提一下,Guido van Rossum本人agrees with this description of the language。)

答案 4 :(得分:2)

促进功能编程的语言(和平台),作为充分利用所述平台功能的手段。

答案 5 :(得分:1)

这种语言使得创建具有副作用的函数比没有副作用更难。对可变/不可变数据结构也是如此。

答案 6 :(得分:0)

您可以使用任何语言进行功能样式编程。我尽可能多地尝试。

Python,Linq都推广功能样式编程。

像Haskell这样的函数语言要求您使用数学函数执行所有计算,不修改任何内容的函数,它们只返回值。

此外,函数式语言通常允许您编写更高阶函数,将函数作为参数和/或返回类型的函数。

答案 7 :(得分:0)

我认为可以询问有关“OOP语言”的相同问题。毕竟,你可以用C编写面向对象的程序(这种情况并不常见)。但是C没有任何内置的语言结构来启用OOP。你必须在没有编译器帮助的情况下“手动”进行OOP。这就是为什么它通常不被认为是OOP语言。我认为这种区别也可以应用于“函数式语言”:例如,用C ++编写函数代码并不罕见(考虑像std::count_ifstd::transform这样的STL函数)。但是C ++(目前)缺乏支持函数式编程的内置语言功能,比如lambdas。 (为了论证,我们忽略boost :: lambda。)

所以,为了回答你的问题,我会说尽管可以用这些语言编写函数程序:

  • C不是函数式语言(没有内置的函数式语言结构)
  • Scheme,Python和朋友都有功能结构,因此它们是函数式语言。但是他们也有必要的和OOP结构,因此它们通常被称为“多范式”语言。

答案 8 :(得分:0)

Haskell对于具有副作用的函数和没有副作用的函数具有不同的类型。

这是一种非常好的辨别属性,因为它是100%功能语言,至少恕我直言。

答案 9 :(得分:0)

我曾经写过一篇(很长篇)分析,为什么“函数式编程语言”这个术语毫无意义,并试图解释为什么Haskell中的“函数”与Lisp或Python中的“函数”完全不同:{{ 3}}

“地图”或“过滤器”之类的东西大部分也可以在C中实现。