我非常清楚功能和命令式编程技术之间的区别。但是人们普遍倾向于谈论“功能语言”,这真让我感到困惑。
当然,像Haskell这样的语言比其他语言(如C语言)更能热衷于函数式编程。但即使前者也使用I / O(它只是将它保存在贫民区)。你可以用C编写功能程序(这简直太荒谬了)。所以也许只是程度问题。
尽管如此,即使是程度问题,当有人称Scheme为“功能语言”时,它意味着什么?我看到的大多数Scheme代码都是必不可少的。如果你愿意的话,只是Scheme可以很容易地用函数式编写吗? Lua和Python也是如此。它们也是“功能语言”吗?
我(真的)不想成为一名语言警察。如果这只是一种松散的谈话方式,那很好。我只想弄清楚它是否确实有一些明确的含义(即使这是一个程度问题的意义),我没有看到。
答案 0 :(得分:16)
在以编程语言为生的人中,“函数式编程语言”是一个相当弱的术语。有一个强烈的共识:
重要的少数群体还为以下语言保留“功能语言”一词:
,如Agda,Clean,Coq和Haskell等语言。
除此之外,被认为是函数式编程语言通常是 intent 的问题,也就是说,设计师是否希望将称为“功能”。
Perl和Smalltalk是支持一流功能但其设计者不会将其称为功能的语言示例。目标Caml是一种被称为功能的语言示例,即使它具有带继承和所有内容的完整对象系统。
被称为“功能性”的语言倾向于具有以下功能(取自Defining point of functional programming):
特定编程语言越具有语法和结构,以使上面列出的各种编程特征容易/轻松地表达和表达。实施,更有可能有人将其标记为“功能语言”。
答案 1 :(得分:12)
我想说功能语言是任何允许函数式编程而没有过度痛苦的语言。
答案 2 :(得分:9)
我喜欢@Randolpho的回答。关于功能,我可以在这里列出这个列表:
Defining point of functional programming
即
特定的编程语言具有更多的语法和结构,以使上面列出的各种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_if
或std::transform
这样的STL函数)。但是C ++(目前)缺乏支持函数式编程的内置语言功能,比如lambdas。 (为了论证,我们忽略boost :: lambda。)
所以,为了回答你的问题,我会说尽管可以用这些语言编写函数程序:
答案 8 :(得分:0)
Haskell对于具有副作用的函数和没有副作用的函数具有不同的类型。
这是一种非常好的辨别属性,因为它是100%功能语言,至少恕我直言。
答案 9 :(得分:0)
我曾经写过一篇(很长篇)分析,为什么“函数式编程语言”这个术语毫无意义,并试图解释为什么Haskell中的“函数”与Lisp或Python中的“函数”完全不同:{{ 3}}
“地图”或“过滤器”之类的东西大部分也可以在C中实现。