函数式编程的一个主要特征是使用无效函数。但是,这也可以用命令语言来完成。递归和lambda函数(例如C ++ 0x)也是如此。因此,我想知道命令式编程语言是否是功能性编程语言的超集。
答案 0 :(得分:20)
我无法确切地说他们是否是彼此的子集。但是,我能说的是(除了真正深奥的语言),它们都是Turing-complete,这意味着最终它们都是同样强大的,但不一定具有同等的表现力。
答案 1 :(得分:9)
一般来说,没有;函数式编程是声明性编程的子集(包括逻辑编程语言,如Prolog)。许多命令式语言从函数式编程语言中借用元素,但简单地使用lambdas或referentially-transparent函数并不能使命令式语言起作用;函数式编程不仅仅是这些元素。
答案 2 :(得分:4)
可以用一种本身不支持编程范式的语言来实现某种编程范例。例如,它可以在C中编写面向对象的代码,而不是为此目的而设计的。
函数式编程是一个完善的编程范式,最好通过Haskell,LISP等语言学习。在学好它们之后,即使你不经常使用这些语言,你也可以开始使用它们。您定期使用的日常语言中的原则。
有些人可能会感谢Google Object oriented programming in C
答案 3 :(得分:4)
范式是一种做事方式,有两种主要的编程范式:命令式和声明式。某些语言允许混合两种范式的事实并不意味着一种语言包含在另一种语言中,而是语言是多范式。
为了更清楚地说明一点,让我继续你的类比:如果Lisp和OCaml(例如)被认为是函数式语言,并且它们都允许命令式......那么命令应该被视为功能的一个子集?
答案 4 :(得分:2)
大多数命令式语言没有作为一阶类型的函数,而大多数函数式函数都没有。 (与C ++一样,通过boost :: function。)
通过一阶类型,这个meas值/变量可以是任何类型,int,bool,来自int-> bool的函数。它通常还包括闭包或绑定值,您可以使用相同的函数,但是已经填充了一些参数。
这两个是函数式编程最常见的,恕我直言。
答案 5 :(得分:2)
我认为区分范例和语言可能会有所帮助。
对我而言,范式代表“思维方式”(概念和抽象,如函数,对象,递归),而语言提供“做事方式”(语法,变量,评估)。
所有真正的编程语言都是等同的,因为它们 Turing-complete 并且理论上能够计算任何图灵可计算函数以及模拟或用通用的图灵机模拟。
有趣的是,在某些语言或范例中完成某些任务是多么困难,这个工具对任务的适当程度。即使康威的生命游戏也是图灵完整的,但这并不能让我想用它进行编程。
许多语言支持多种范例。 C ++被设计为C的面向对象扩展,但是可以在其中编写纯粹的过程代码。
有些语言随着时间的推移借用/获取其他语言或范例的功能(只看Java的演变)。
一些语言,如Common Lisp,是令人印象深刻的多范式语言。可以在Lisp中编写功能,面向对象或过程的代码。可以说,面向方面已经是常见的lisp对象系统的一部分,因此“没什么特别的”。在Lisp中,很容易扩展语言本身来做你需要做的事情,因此它有时被称为“可编程编程语言”。 (我会在这里指出,Lisp描述的是一系列语言,其中Common Lisp只有一种方言)。
我认为哪个术语,声明性,命令性,功能性或程序性是其中的一个子集并不重要。更重要的是了解您正在使用的工具语言,以及它们与其他工具的不同之处。更重要的是理解范式所代表的不同思维方式,因为这些是你的思维工具。与生活中的大多数其他事物一样,你理解的越多,你就越有效。
答案 6 :(得分:2)
一种看待它的方式(不是说它是正确的方式'因为我不是一个lang设计师或任何方式的理论家)是如果语言基本上转换为其他东西然后“其他东西”必须是来源的超集。所以字节码必然是Java的超集。 .NET IL是C#和F#的超集。因此,C#中的功能构建体(即LINQ)是IL的命令性构建体的子集。
由于机器语言是必不可少的,因此您可以采取这样的立场:因此,所有语言都是必不可少的,因为它们只是对人类有用的抽象,然后被编译器煮沸为程序性的,命令式的机器代码。
答案 7 :(得分:1)
模式映射,如
f:: [int] -> int
f [] = 0
f (x:xs) = 1 + f(xs)
是一种在命令式语言中不可用的东西。 还有类似curried函数的构造:
add2 :: int -> int
add2 = (2 +)
在大多数命令式语言中不可用