我读过一些资料,其中哈斯克尔范式被描述为functional
但imperative
范式。说这话的主要来源是维基百科。functional
和imperative
范式怎么可能同时存在,还是这是一个错误?
函数式语言在描述其程序时通常使用声明性方法,Haskell绝对是这些语言之一;Haskell程序被描述为一组值的声明(包括函数,因为函数是第一类值(。
但是,为了使计算机执行程序,它必须遵循一系列指令。为此,Haskell有一种方法可以用一种特殊的语法(称为"do语法"(来描述执行时最终会成为排序的内容。此语法的每一行看起来都像是正常命令式语言中的下一个"语句",并且也以这种方式运行。不过,实际上,它只是函数应用程序的普通Haskell表达式的语法糖。
但是,因为它仍然是用Haskell编写的,并且Haskell的值和表达式在很大程度上是type安全的,所以Haskell通常被称为"最好的命令式语言"。
只要改变程序原子部分的顺序可以改变它的输出,你就可以安全地在语言上打"命令式"。几乎任何高级语言在某种程度上都是"声明式"的,并且有些语言比Haskell更好地支持"声明式编程"。
例如,在 C 中,enum
s 甚至 switch
都可以是"声明性的",如果你以某种方式使用它。在"声明式"方向上更进一步的是Prolog,你可以用声明式风格编写程序,但同样,你也可以使用Prolog来编写命令式程序。
声明性的,但有一些警告。
Alonso Church创建了Haskell所基于的lambda演算,Alan Turing创建了图灵机。Lambda演算是纯粹的函数,图灵机改变程序的状态。听起来很耳熟?
除了,已经证明这两者是等价的。您可以从lambda演算构建图灵机,反之亦然。这意味着Haskell内部的所有内容实际上都只是函数,但是从中您可以构建命令式编程风格。
所以是的,声明性的。你不会告诉Haskell如何做事,你告诉它什么是东西,然后从中构建。