Functional programming &引用;函数式编程“;有明确的含义,但确实;函数式语言;?

Functional programming &引用;函数式编程“;有明确的含义,但确实;函数式语言;?,functional-programming,scheme,Functional Programming,Scheme,我非常清楚函数式编程技术和命令式编程技术之间的区别。但是有一种广泛的倾向是谈论“函数式语言”,这让我很困惑 当然,像Haskell这样的一些语言比像C这样的其他语言更适合函数式编程,但即使是前者也做I/O(它只是把它放在一个贫民区)。你可以用C语言编写函数式程序(这简直太难了)。所以也许这只是程度的问题 然而,即使是程度问题,当有人将Scheme称为“函数式语言”时,它意味着什么?我看到的大多数方案代码都是强制性的。如果你想的话,仅仅是Scheme让你很容易用函数式的风格来写?Lua和Pytho

我非常清楚函数式编程技术和命令式编程技术之间的区别。但是有一种广泛的倾向是谈论“函数式语言”,这让我很困惑

当然,像Haskell这样的一些语言比像C这样的其他语言更适合函数式编程,但即使是前者也做I/O(它只是把它放在一个贫民区)。你可以用C语言编写函数式程序(这简直太难了)。所以也许这只是程度的问题

然而,即使是程度问题,当有人将Scheme称为“函数式语言”时,它意味着什么?我看到的大多数方案代码都是强制性的。如果你想的话,仅仅是Scheme让你很容易用函数式的风格来写?Lua和Python也是如此。它们也是“函数语言”吗


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

我想说函数式语言是任何允许函数式编程而不会带来不必要痛苦的语言

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

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

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

Python、Linq都提倡函数式编程

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


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

我认为关于“OOP语言”也可以问同样的问题。毕竟,您可以用C编写面向对象的程序(这样做并不少见)。但是C没有任何内置的语言结构来支持OOP。您必须“手动”执行OOP,而不需要编译器的帮助。这就是为什么它通常不被认为是OOP语言。我认为这个区别也可以应用到“函数语言”中:例如,在C++中编写函数代码并不罕见(想想STL函数,比如<代码> STD::CurtTube如果或 STD::Trime)。但是C++(现在)缺少内置的语言功能,如LAMBDAS。(为了这个参数,让我们忽略boost::lambda。)

所以,为了回答你的问题,我想说,尽管可以用以下每种语言编写函数程序:

  • C不是函数式语言(没有内置函数式语言构造)
  • Scheme、Python和friends都有函数结构,所以它们是函数语言。但是它们也有命令式和面向对象的结构,所以它们通常被称为“多范式”语言

不久前,简·斯特里特的布赖恩·赫特(Brian Hurt)在这方面写了一篇文章。他得出的基本定义是,函数式编程语言是一种建模lambda演算的语言。想想什么语言被广泛认为是功能性的,你会发现这是一个非常实用的定义

Lisp是对lambda演算建模的原始尝试,因此它符合这个定义——尽管由于大多数实现都不太符合lambda演算的思想,它们通常被认为是混合范式,或者最多是弱函数


这也是为什么很多人对Python这样的语言被称为函数式语言感到愤怒的原因。Python的一般哲学与lambda微积分无关——它根本不鼓励这种思维方式——因此它不是函数式语言。这是一台具有一流功能的图灵机。您可以用Python进行函数式编程,是的,但是这种语言的根源与函数式语言不同。(顺便提一下,吉多·范·罗瑟姆本人。)

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

  • 纯度(又称不变性,避免副作用,参考透明度
  • 高阶函数(例如,将函数作为参数传递,作为结果返回,将匿名函数动态定义为lambda表达式)
  • 懒惰(又称非严格评估,与纯度结合时最有用/可用)
  • 代数数据类型模式匹配
  • 闭包
  • 咖喱/部分应用
  • 参数多态性(又称泛型)
  • 递归(由于纯度更高)
  • 使用表达式而不是语句编程(同样,来自purity)

一种特定的编程语言的语法和结构越多,以使上面列出的各种FP功能易于表达和实现,就越有可能有人将其标记为“函数式语言”。

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


作为一种100%函数式语言,至少是IMHO,这是一个很好的区分属性。

在以学习编程语言为生的人中,“函数式编程语言”是一个非常弱的约束术语。有一个强烈的共识是:

  • 任何称自己为函数的语言都必须支持,带有词法的嵌套函数