如何命名Haskell表达式的“=”?

时间:2016-02-05 02:14:02

标签: haskell semantics

let a = 3

是不是意味着:

  • “构造名为”或
  • 的对象
  • “将值3绑定到对象a”或
  • “为变量a赋值?

如果Haskell中的所有内容都是函数,那么我可以说这里也是一个函数吗?但是可以调用函数,我怎么称之为“a”?

4 个答案:

答案 0 :(得分:4)

let a=3
  

"构建一个名为"

的对象

不,这不是Haskell的常用术语。

  

"将值3绑定到对象a"

这更接近。可以简单地说"将值3绑定到名称(或变量或标识符)a"。没有"对象"在哈斯克尔。

  

"为变量a"

指定一个值

不,"任务"通常意味着可以改变变量的值,而在纯函数式编程中则不然。

就个人而言,我只是将let a = 3视为"将a定义为3"。在Haskell中,大多数情况下,我们会推断变量的值,忽略何时构造/分配/垃圾收集的确切时间以及值在内存中的确切表示方式。所以,我们通常会避免考虑"如何"在操作上执行一个程序,更多地关注"什么"是结果,是否是预期结果("指称")。

当然,在我们得到预期结果后,我们会开始关注我们程序的性能。为此,我们至少需要对"如何"程序执行,内存分配等

答案 1 :(得分:3)

首先,只是为了解决这个问题,并非Haskell中的所有内容都是函数。函数实际上是(->)运算符表示的自己的类型。这是函数的类型声明看起来像func :: a -> b的方式。然而,Haskell中的大多数东西都是懒惰的,这意味着在实际需要之前不会对值进行求值。这与无争论函数在其他语言中的行为类似,因此,至少出于某些目的,值可以概念化作为函数。但这并不意味着您的示例中的a是可调用的。

至于措辞,后两者中的任何一个都是准确的。我更喜欢第二种,但两种都有效。在Haskell中,let a = 3并没有真正构造一个参数,所以第一个并没有多大意义。 (不是大多数Haskell程序员工作的水平;我不知道生成的机器代码是如何工作的。)

总而言之,我建议你去参加一些关于Haskell的入门课程。他们中的大多数都涵盖了这种东西。

编辑:正如其他一些答案所指出的那样,“" assign"倾向于暗示Haskell没有的某种程度的可变性。出于这个原因,我会反对最后的措辞。

答案 2 :(得分:1)

  

是不是意味着:

     

“构造一个名为”的对象或“将值3绑定到对象a”或“赋值”   一个变量为“?

的值

不,不,不,不。

首先,在Haskell中,我们说的是,而不是对象。例如,数字是值,您知道每个数字都有无限多个名称。例如:

0
the predecessor of 1
the predecessor of the precdecessor of 2
the predecessor of ...(32493 times)... the predecessor of 32495
the product of 1 and 0
the product of the successor of 1 and 0
...
... and so on, you get the idea
...

现在,正如通常的语言一样,当我们经常需要提到一个复杂名称的东西时,我们倾向于发明一个简短的名字。例如,当我们写一篇关于“促进酒精,烟草和火器局”活动的文章时,我们会引入一个缩写,如

  

促进酒精,烟草和枪支(ATF)局是   agian在新闻中。 ATF的负责人,饮料A'Glass,在一个   采访当你无法吸烟时,单独喝啤酒是不好的   同时。 ...

同样,在Haskell中,我们可能需要提到“元组的第一个元素的平方,它是将函数f应用于名称为 xs 的某个列表的结果”,我们可以给出它就是这样的名字

let a = sqr . fst . f $ xs

从此我们可以使用a。 由于引用透明度,如果您执行此操作并使用名称a或始终编写复杂表达式,则无关紧要程序的含义。因此,这个原则保证了名称及其定义的含义与“2的前身”和“0的后继者”与1的相同方式相同。

答案 3 :(得分:0)

据我所知,变量并不意味着事物是可变的,但是价值不是固定的,而是取决于上下文。例如,当您定义数学函数f(x) : x -> x+1时,x的变量取决于您调用它时传递给f的内容,f将始终是相同的功能。没有可变性的概念,只有范围。在Haskell中,我认为事情是相同的,变量是任何'绑定'这不是全球性的,但生活在有限的范围内。我会使用defines,但我不明白为什么要分配'不合适。