函数式编程的主要特点之一是使用无副作用的函数。然而,这也可以在命令式语言中实现。递归和Lambda函数也是如此(例如C++0x)。因此,我想知道命令式编程语言是否是函数式编程语言的超集。
函数式编程的主要特点之一是使用无副作用的函数。然而,这也可以在命令式语言中实现。递归和Lambda函数也是如此(例如C++0x)。因此,我想知道命令式编程语言是否是函数式编程语言的超集。
我无法确定它们是否是彼此的子集。但是我可以告诉你(除了真正晦涩难懂的语言),它们都是图灵完备的,这意味着最终它们都同样强大,但不一定同样表达能力。
一般来说不行;函数式编程是声明式编程的一个子集(包括逻辑编程语言,如Prolog)。许多命令式语言从函数式编程语言中借鉴了元素,但仅仅有lambda或引用透明函数并不能使命令式语言成为函数式的;函数式编程不仅仅是这些元素。
从一种角度来看(并不是说这是正确的方式,因为我并不是语言设计师或理论家),如果语言本质上转换成其他东西,那么“其他东西”必须是源代码的超集。因此,字节码必须是Java的超集。.NET IL是C#和F#的超集。 C#中的函数式结构(即LINQ)因此是IL的命令结构的子集。
由于机器语言是命令式的,因此您可以认为所有语言都是命令式的,因为它们只是对人类有用的抽象,然后被编译器煮掉成过程性的、命令式的机器代码。
大多数命令式语言没有将函数作为一级类型,而大多数函数式语言则有(通过boost::function,C++也可以实现)。
所谓的一级类型是指一个值/变量可以是任何类型,比如int、bool、从int到bool的函数。通常还包括闭包或绑定值,其中你有相同的函数,但某些参数已经填充。
在我看来,这两个方面是函数式编程的主要内容。
类似于模式映射
f:: [int] -> int
f [] = 0
f (x:xs) = 1 + f(xs)
某些东西例如在命令式语言中不可用。 还有像柯里化函数这样的结构:
add2 :: int -> int
add2 = (2 +)
在大多数命令式语言中不可用
是的,函数式编程是命令式编程的一个子集,但是...
是的,因为在函数式编程中没有任何你不能在命令式编程中做到的事情(语法差异除外)。你可以在命令式语言中“做”函数式编程。
但是... 你不能做的事情是函数式编程的关键特性。 通过限制你所能做的事情,
函数式编程的其他好处更加主观。 你经常听到这些争论。
这是一个可疑的好处。 首先,只有无意的副作用是不好的。适当的编程实践,例如将对状态的修改限制为特权代码,可以缓解副作用问题。 其次,函数式编程只有内部状态。如果程序具有IO(访问文件、网络、硬件),则具有外部状态,因此具有副作用的潜力。
在某些方面是的,比如知道异常的显式路径。 但是有状态可供检查是函数式编程没有的调试优势。
只有当您精通函数式编程而不精通命令式编程时,这才是真的。 就我个人而言,作为一名更精通命令式编程的人,我认为这个论点是错误的。