Programming languages 函数式编程是命令式编程的子集吗?

Programming languages 函数式编程是命令式编程的子集吗?,programming-languages,functional-programming,imperative-programming,Programming Languages,Functional Programming,Imperative Programming,函数式编程的主要特点之一是使用无副作用函数。然而,这也可以用命令式语言实现。递归和lambda函数(例如C++0x)也是如此。因此,我想知道命令式编程语言是否是函数式编程语言的超集。在一种本机不支持编程范式的语言中实现某种编程范式是可能的。例如,在C语言中编写面向对象的代码是可能的,而它不是为此目的而设计的 函数式编程本身就是一种发展良好的编程范式,最好通过Haskell、LISP等语言学习。学好这些语言后,即使您不经常使用这些语言,您也可以开始在日常使用的语言中使用这些原则 有些人可能喜欢用谷

函数式编程的主要特点之一是使用无副作用函数。然而,这也可以用命令式语言实现。递归和lambda函数(例如C++0x)也是如此。因此,我想知道命令式编程语言是否是函数式编程语言的超集。

在一种本机不支持编程范式的语言中实现某种编程范式是可能的。例如,在C语言中编写面向对象的代码是可能的,而它不是为此目的而设计的

函数式编程本身就是一种发展良好的编程范式,最好通过Haskell、LISP等语言学习。学好这些语言后,即使您不经常使用这些语言,您也可以开始在日常使用的语言中使用这些原则


有些人可能喜欢用谷歌搜索

我真的说不出他们是否是彼此的子集。不过,我能说的是(除了真正深奥的语言)它们都是,这意味着最终它们都是同样强大的,但不一定同样具有表达力

范例是一种做事的方式,有两种主要的编程范例:命令式和声明式。有些语言允许混合这两种范式的事实并不意味着一种范式包含在另一种范式中,而是说这些语言是多范式的


为了更清楚一点,让我继续你的类比:如果Lisp和OCaml(例如)被认为是函数式语言,并且它们都允许命令式风格。。。那么祈使句是否应该被视为功能的子集呢?

一般来说,不;函数式编程是声明式编程(包括逻辑编程语言,如Prolog)的子集。许多命令式语言借用函数式编程语言的元素,但仅仅拥有lambda或引用透明函数并不能使命令式语言具有功能性;函数式编程不仅仅是这些元素。

大多数命令式语言都没有函数作为一阶类型,而大多数函数式语言都是o。(C++一样,通过Booo::函数)< /P> 按一阶类型,这意味着值/变量可以是任何类型,int、bool、int->bool中的函数。它通常还包括闭包或绑定值,其中您有相同的函数,但一些参数已经填充

这两个是函数式编程的主要内容,IMHO

模式映射类似

f:: [int] -> int
f [] = 0
f (x:xs) = 1 + f(xs)
例如,在命令式语言中是不可用的。 也有类似于curried函数的构造:

add2 :: int -> int
add2 = (2 +)

在大多数命令式语言中不可用

我认为区分范例和语言可能会有所帮助

对我来说,范式代表“思维方式”(概念和抽象,如函数、对象、递归),而语言提供“做事方式”(语法、变量、评估)

所有真正的编程语言都是等价的,因为它们是图灵完备的,并且在理论上能够计算任何图灵可计算函数以及模拟或被通用图灵机模拟

有趣的是,用某些语言或范例完成某些任务有多困难,工具对任务的适用性有多合适。即使康威的人生游戏是图灵完成的,但这并没有让我想用它来编程

许多语言支持许多范例。C++被设计成面向对象的C扩展,但是它可以在其中编写纯的过程代码。 随着时间的推移,一些语言从其他语言或范例中借用/获取特性(只需看看Java的发展)

一些语言,如Common Lisp,是令人印象深刻的多范式语言。可以在Lisp中编写功能性、面向对象或过程性的代码。可以说,面向方面已经是通用lisp对象系统的一部分,因此“没有什么特别的”。在Lisp中,可以很容易地扩展语言本身来完成您需要它做的任何事情,因此它有时被称为“可编程编程编程语言”。(这里我要指出,Lisp描述的是一个语言家族,其中Common Lisp只是一种方言)


我认为,无论是声明性的、命令式的、功能性的还是程序性的,哪一个术语是其中的一个子集都无关紧要。更重要的是理解您使用的工具语言,以及这些工具与其他工具的区别。更重要的是要理解范式所代表的不同思维方式,因为它们是你的思维工具。与生活中的大多数其他事情一样,你理解得越多,你就会变得越有效。

一种看待它的方式(不是说这是正确的方式,因为我不是语言设计师或理论家)是,如果语言本质上被转换成其他东西,那么“其他东西”必须是源代码的超集。所以字节码必然是Java的超集。NET IL是C和F的超集。因此,C#(即LINQ)中的功能结构是IL命令结构的子集


由于机器语言是命令式的,因此您可以采取这样的立场,即所有语言都是命令式的,因为它们只是对人类有用的抽象,然后被编译器分解为过程性的命令式机器代码。

有趣的问题。。。在命令式编程中,我相信您有更多的方法来“绞死自己”:我同意您关于“无副作用函数”的想法。“无副作用函数”库可以在两种范式中编写和使用,而有状态命令式过程不能在两种范式中使用