[英]Are there any studies on whether functional/declarative or imperative programming is easier to learn as a first language?
[英]Is functional programming a subset of imperative programming?
函数式编程的主要特征之一是使用无副作用的函数。 但是,这也可以在命令式语言中完成。 递归和 lambda 函数(例如 C++0x)也是如此。 因此,我想知道命令式编程语言是否是函数式编程语言的超集。
我不能说它们是否是彼此的子集。 然而,我能说的是(除了真正深奥的语言)他们都是图灵完全的 ,这意味着最终他们都是同样强大的,但不一定具有同样的表现力。
一般来说,没有; 函数式编程是声明式编程的一个子集(包括逻辑编程语言,如Prolog)。 许多命令式语言从函数式编程语言中借用元素,但简单地使用lambdas或referentially-transparent函数并不能使命令式语言起作用; 函数式编程不仅仅是这些元素。
范式是一种做事方式,有两种主要的编程范式:命令式和声明式。 某些语言允许混合两种范式的事实并不意味着一种语言包含在另一种语言中,而是语言是多范式的 。
为了更清楚地说明一点,让我继续你的类比:如果Lisp和OCaml(例如)被认为是函数式语言,并且它们都允许命令式......那么命令式应该被视为功能的一个子集吗?
大多数命令式语言没有作为一阶类型的函数,而大多数函数式函数都没有。 (与C ++一样,通过boost :: function。)
通过一阶类型,这个meas值/变量可以是任何类型,int,bool,来自int-> bool的函数。 它通常还包括闭包或绑定值,您可以使用相同的函数,但是已经填充了一些参数。
这两个是函数式编程主要是关于恕我直言。
我认为区分范式和语言可能会有所帮助。
对我来说, 范式代表“思维方式” (概念和抽象,如函数,对象,递归),而语言则提供“做法” (语法,变量,评估)。
所有真正的编程语言都是等同的 ,因为它们是图灵完备的,并且理论上能够计算任何图灵可计算函数以及通用图灵机模拟或模拟。
有趣的是,在某些语言或范例中完成某些任务是多么困难,这个工具对任务的适当程度。 即使康威的生命游戏也是图灵完成的,但这并不能让我想用它编程。
许多语言支持许多范例。 C ++被设计为C的面向对象的扩展,但是可以在其中编写纯粹的过程代码。
有些语言随着时间的推移借用/获取其他语言或范例的功能(只看Java的演变)。
一些语言,如Common Lisp,是令人印象深刻的多范式语言。 可以在Lisp中编写功能,面向对象或过程的代码。 可以说,面向方面已经是常见的lisp对象系统的一部分,因此“没什么特别的”。 在Lisp中,很容易扩展语言本身来做你需要做的事情,因此它有时被称为“可编程编程语言”。 (我将在这里指出Lisp描述的是一系列语言,其中Common Lisp只有一种方言)。
我认为哪个术语,声明性,命令性,功能性或程序性是其中的一个子集并不重要。 更重要的是了解您正在使用的工具语言,以及它们与其他工具的不同之处。 更重要的是理解范式所代表的不同思维方式,因为这些是你的思维工具。 与生活中的大多数其他事物一样,您理解的越多,您变得越有效。
一种看待它的方式(不是说它是正确的方式'因为我不是一个lang设计师或任何方式的理论家)是如果语言基本上转换成其他东西那么'别的'必须是超集的来源。 所以字节码必然是Java的超集。 .NET IL是C#和F#的超集。 因此,C#中的功能构建体(即LINQ)是IL的命令性构建体的子集。
由于机器语言是必不可少的,因此您可以采取这样的立场:因此,所有语言都是必不可少的,因为它们只是对人类有用的抽象,然后被编译器煮沸为程序性的,命令式的机器代码。
模式映射就好
f:: [int] -> int
f [] = 0
f (x:xs) = 1 + f(xs)
例如,在命令式语言中没有的东西是一件事。 还有类似curried函数的构造:
add2 :: int -> int
add2 = (2 +)
在大多数命令式语言中不可用
是的,函数式编程是命令式编程的一个子集,但是......
是的,因为没有函数式编程,你不能在命令式编程做(尽管语法差异)。 您可以使用命令式语言“进行”函数式编程。
但是......你不能做的事情是函数式编程的关键特性。 通过限制你可以做的事情,
函数式编程的其他好处更加主观。 你经常听到这些论点。
这是一个可疑的好处。 首先,只有意想不到的副作用是不好的。 适当的编程实践,例如限制对特权代码的状态修改,可以缓解副作用问题。 其次,函数式编程没有内部状态。 如果程序有 IO(访问文件、网络、硬件),则您有外部状态,因此可能会产生副作用。
在某些方面是的,比如知道异常的显式路径。 但是有状态检查是函数式编程没有的调试好处。
只有当您精通函数式编程而不精通命令式编程时,这才是正确的。 一方面,我对命令式编程更加流利,认为这个论点是错误的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.