为什么Haskell完全声明?

时间:2016-10-19 11:20:48

标签: haskell declarative

我不太了解命令式声明式编程范例之间的区别。我读到Haskell是一种声明性语言。在某种程度上,我会说是的,但是在命令的定义方面有一些困扰我的东西。

当我有一个数据结构并使用Haskell的函数进行转换时,我实际上只是告诉了要转换的内容。所以我将datastruct作为参数提供给函数,并对结果感到满意。

但如果没有任何功能可以满足我的需求呢?

我会开始编写一个自己的函数,它希望datastruct作为参数。之后,我将开始编写如何处理数据结构。既然我只能调用原生的Haskell函数,那么我仍然可以使用声明范式吗?但是,当我开始使用" if语句"时。因为我要告诉程序如何从那一点做事情,这不会结束声明性质吗?

5 个答案:

答案 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类型,bc必须具有相同的类型,这进一步受到限制。

是语法糖
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

这又是一个充满声明的声明。