Haskell 是命令式还是声明式范式?

Is Haskell an imperative or declarative paradigm?

我读过一些资料,其中 Haskell 的范式被描述为 functionalimperative 范式。说这话的主要来源是Wikipediafunctionalimperative 范式怎么可能同时存在,或者这是一个错误?

函数式语言在描述它们的程序时通常使用声明性方法,Haskell 绝对是其中一种语言; Haskell 程序被描述为一组值声明(包括函数,因为函数是第一个 class 值)。

但是,为了让计算机执行程序,它必须遵循一系列指令。为此,Haskell 提供了一种方法,您可以使用一种特殊的语法(称为 "do syntax")来描述在执行时最终可以排序的内容。此语法的每一行看起来都像普通命令式语言中的下一个 "statement",并且也有类似的行为。不过,实际上,它只是函数应用程序的普通 Haskell 表达式的语法糖。

因为它仍然是用 Haskell 编写的,而且 Haskell 值和表达式大部分是类型安全的,所以 Haskell 通常称为 "the best imperative language"。

只要改变程序原子部分的顺序可以改变它的输出,你就可以安全地对语言进行攻击 "imperative"。几乎所有高级语言在某种程度上都是 "declarative",并且有些语言比 Haskell 更好地支持 "declarative programming"。

在 C 中,例如,enums 甚至 switch 可以是 "declarative",如果您以某种方式使用它。在 "declarative" 方向上走得更远的是 Prolog,您可以用声明式的方式编写程序,但同样,您也可以使用 Prolog 来编写命令式程序。