我不太了解命令式和声明式编程范例之间的区别。我读到Haskell是一种声明性语言。在某种程度上,我会说是的,但是在命令的定义方面有一些困扰我的东西。
当我有一个数据结构并使用Haskell的函数进行转换时,我实际上只是告诉了要转换的内容。所以我将datastruct作为参数提供给函数,并对结果感到满意。
但如果没有任何功能可以满足我的需求呢?
我会开始编写一个自己的函数,它希望datastruct作为参数。之后,我将开始编写如何处理数据结构。既然我只能调用原生的Haskell函数,那么我仍然可以使用声明范式吗?但是,当我开始使用" if语句"时。因为我要告诉程序如何从那一点做事情,这不会结束声明性质吗?
答案 0 :(得分:7)
也许这是一个透视问题。我看待它的方式,没有必要用其他东西来定义事物,因为我们总是可以用它的定义替换某些东西(只要定义是纯粹的)。也就是说,如果我们有f x = x + 1
,那么我们看到的任何地方f z
都可以替换为z + 1
。所以纯函数不应该被认为是指令;它们应被视为定义。
由于这个原因,许多Haskell代码被认为是声明性的。我们简单地将事物定义为其他事物的(纯)函数。
也可以在Haskell中编写命令式代码。有时我们真的想说“做A,然后做B,然后做C”。这为函数应用的简单世界增加了一个新的维度:我们需要一个“先发生过”的概念。 Haskell已经接受了Monad概念来描述具有评估顺序的计算。这结果非常方便,因为它可以封装诸如改变状态之类的效果。
答案 1 :(得分:6)
Haskell中没有if
语句,只有if
表达式 if a then b else c
,这实际上等同于a ? b : c
中的三元表达式类似C语言或Python中的b if a else c
。您不能忽略else
,它可以在任何可以使用任意表达式的地方使用。 a
必须具有Boolean
类型,b
和c
必须具有相同的类型,这进一步受到限制。
case a of
True -> b
False -> c
不要太挂在标签上"声明&#34 ;;它只是该语言支持的编程的样式。例如,考虑一个典型的阶乘函数的声明性定义:
fact 0 = 1
fact n = n * fact (n - 1)
这也是你认为更迫切需要的东西的语法糖:
fact n = case n of
0 -> 1
otherwise -> n * fact (n - 1)
答案 2 :(得分:5)
Frankly, the term "declarative programming" is more of a marketing term than anything else. The informal definition that it means "specifying what to do, not how to do it" is vague and open to interpretation and definitely far from a black-and-white boundary. In practice, it seems to be applied to anything that broadly falls into the categories of functional programming, logic programming or the use of Domain-Specific Languages (DSLs).
Consequently (and I realise this probably doesn't qualify as an answer to your question, but still :)), I recommend you do not waste your time wondering whether something is still declarative or not. The terms imperative vs. functional vs. logic programming are already a bit more meaningful, so perhaps it's more useful to reflect on those.
答案 3 :(得分:3)
声明性语言是从表达式构造的,而命令式语言是从语句构造的。
通常的解释是做什么与如何做。你已经发现了这个混乱。如果你采取这种方式,声明性使用定义(按名称),命令式是写定义。什么是声明性语言呢?只列出定义的一个?如果是这样,那么您可以编写的唯一Haskell程序就是main
!
有一种声明方式和一种必要的分支方式,它直接来自定义。声明性分支是表达式,而命令式分支是声明。 Haskell有case … of …
(表达式),C有if (…) {…} else {…}
(语句)。
表达式和语句之间有什么区别?表达式具有值,而语句具有效果。价值和效果有什么区别?
对于表达式,有一个函数μ
可将任何表达式e
映射到其值μ(e)
。这也称为语义,或含义,理想情况下是一个明确定义的数学对象。这种定义值的方式称为指称语义。还有其他方法。
对于语句,紧接在语句S之前的状态P和紧接在之后的状态Q. S的影响是从P到Q的增量。这种定义效果的方式称为 Hoare logic 。还有其他方法。
答案 4 :(得分:0)
您无法使用" if语句"在Haskell,因为没有。您可以使用" if-expression"
TableViewer.getTable().getSelectionIndices()
但这只是
之类的语法糖if c then a else b
这又是一个充满声明的声明。