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

Haskell是命令式还是声明式范例?,haskell,functional-programming,imperative-programming,declarative-programming,Haskell,Functional Programming,Imperative Programming,Declarative Programming,我读过一些资料,其中Haskell的范式被描述为功能性但命令性范式。这一说法的主要来源是。如何可能同时使用功能性和命令性范式,或者这是一个错误 函数式语言在描述其程序时通常使用声明式方法,Haskell无疑是其中之一;Haskell程序被描述为一组值声明(包括函数,因为函数是第一类值) 然而,为了让计算机执行一个程序,它必须遵循一系列指令。为此,Haskell提供了一种方法,您可以用一种特殊的语法(称为“do语法”)来描述在执行时可以作为序列的内容。这种语法的每一行看起来都像是普通命令式语言中的

我读过一些资料,其中Haskell的范式被描述为
功能性
命令性
范式。这一说法的主要来源是。如何可能同时使用
功能性
命令性
范式,或者这是一个错误

函数式语言在描述其程序时通常使用声明式方法,Haskell无疑是其中之一;Haskell程序被描述为一组值声明(包括函数,因为函数是第一类值)

然而,为了让计算机执行一个程序,它必须遵循一系列指令。为此,Haskell提供了一种方法,您可以用一种特殊的语法(称为“do语法”)来描述在执行时可以作为序列的内容。这种语法的每一行看起来都像是普通命令式语言中的下一个“语句”,其行为也是如此。但实际上,这只是函数应用程序的普通Haskell表达式的语法糖


由于Haskell仍然是用Haskell编写的,而且Haskell值和表达式在很大程度上是类型安全的,因此Haskell通常被称为“最佳命令式语言”。

只要更改程序原子部分的顺序可以更改其输出,就可以安全地在语言上使用“命令式”。几乎任何高级语言在某种程度上都是“声明式”的,并且有一些语言比Haskell更好地支持“声明式编程”


例如,在C语言中,
enum
s甚至
开关
都可以是“声明式”的,如果您以某种方式使用它的话。在“声明性”的方向上,Prolog更进一步,您可以用声明式风格编写程序,但同样,您也可以使用Prolog编写命令式程序。

就是这样,给出的理由是“官方维基声明”。。。但是没有具体的参考资料。我认为这个添加是错误的,维基百科的文章应该是回卷的,有什么意见吗?事情从来都不是黑白分明的。你的问题让我想起了。@leftaroundabout声称Haskell绝对不是命令式编程语言是很不诚实的,你不觉得吗?你的英语有点不传统;无论如何,继续阅读和学习,非常重要的是写代码,事情会慢慢变得不那么绝对。我认为一个重要的问题是。。。“为什么这个问题很重要?”!也就是说,提问者在问什么,为什么他们想知道?Haskell是声明性的。然而,根据定义,计算机程序是必不可少的。Haskell语言有一些看起来像序列命令的东西,但它们实际上是关于命令的表达式声明,只是在以后由编译器转换成命令式代码。像
putStrLn“hi”
这样的操作不是命令,也不做任何事情。这可能会有帮助:对于我来说,用一种没有命令式方式的语言编程是很困难的。尽管如此,维基百科还是将Haskell描述为纯粹的函数式编程,这与你的答案如何?Haskell是最好的命令式语言确实有些道理,但它显然具有讽刺意味。我想说Haskell本身是一个彻头彻尾的陈述式,根本不是命令式的;只有
IO
ST
是必需的EDSL,它们恰好可以在Haskell中轻松描述(声明!)。我认为这并不困难。哈斯克尔两者都是。当您为
main
(Haskell程序的入口点)赋值时,您是在以声明的方式描述程序在执行时应该做什么。你不是给编译器语句,而是给它声明。但是,这些声明可以按顺序编写。如果您使用
do
语法连接并“排序”三个
printLn
表达式,那么您告诉Haskell编译器从它们中按顺序构建一个表达式。虽然事实上是陈述式的,但实际上它是命令式的。区别就像是说我给你一个指令列表,其中你同意一个接一个地执行每个指令,而不是给你一个值和表达式列表,按照任何顺序,其中一些使用其他值和表达式,还有一个指令说“做这件事”(碰巧使用了所有其他表达式)。Haskell不是必须的。但是,对于使用
IO
编程的最终程序员来说,有时看起来确实是这样的(知道你的程序基本上是类型安全的,并且使用不可变的数据,这确实有帮助,因为它可以避免许多简单的错误)。