2016-02-05 60 views
1
let a = 3 

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

  • “构建体命名为一个对象”或者
  • “绑定值3到对象一”或
  • “值分配给变量”?

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

+1

我投票支持关闭这个问题作为题外话,因为你不能通过在SO上询问它们来学习一种新语言的最基本的基础知识。这是教程的目的。 – dfeuer

+2

让我们一起3.我们给一个名字一个值,这就是它的全部。 – Ingo

+0

@dfeuer我觉得这是一个很好的问题,它表明OP想要理解某些东西。你和我的关于如何学习东西的想法可能与OP如何处理事情有所不同。这并没有改变这个问题涉及到一个重要概念 - 指称交易 - 这个事实,我们不应该一再疲倦地解释它。只是我的0,02€ – Ingo

回答

4
let a=3 

“构建一个名为对象” 在Haskell

不,这是不常见的术语。

“绑定值3到对象a”

这是更近。人们可以简单地说“将值3绑定到名称(或变量,或标识符)a”。 Haskell中没有“对象”。

“值分配给变量”

没有,“分配”通常意味着一个可能变异变量的值,当这不是纯函数编程的情况。

就我个人而言,我只是读let a = 3为“定义a3”。在Haskell中,大多数时候,我们推理变量的值,忽略何时构建/分配/垃圾收集的确切值以及值在内存中的表示方式。所以,我们通常会避免去思考一个程序在执行过程中的“如何”,更多地关注“结果是什么”以及它是否是预期的(“指称性”)。

当然,在获得预期的结果后,我们开始关注我们的计划的表现。为此,我们至少需要对程序执行的“如何”,内存分配等有一个大概的了解。

+1

我认为“绑定到名称”在Haskell中肯定比“绑定到变量”更加错误...... –

+0

@ErikAllik可能是这样的。我有时会把“变量”看作“带有范围的名称”,其中“名称”只是一个字符串/语法标识符。无论如何,我编辑。 – chi

3

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

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

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

编辑:正如其他一些答案指出的,“赋值”这个词往往意味着某种程度的可变性,这是Haskell没有的。出于这个原因,我会建议反对最后的措辞。

+0

Haskell通常不会有任何我会称之为“字节码”的东西。 –

+0

@SebastianRedl,是的,当时我想不出一个更好的词。我解决了这个问题。 – Kwarrtz

0

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

1

莫非:

“构建体命名为一个对象”或者“结合值3到对象一”或“分配 一个值变量”?

不,不,再次,没有。

首先,在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)新闻中的消息是 。 ATF的负责人Drink A'Glass在 的采访中说,如果你不能同时拥有好的烟雾 ,啤酒本身就不好。 ...

同样,在Haskell中,我们可能需要提及的“元组的第一个元素是将函数f一些名单,其名称是XS结果的平方”,我们可以给它像这样

let a = sqr . fst . f $ xs 

一个名称,叫我们可以只使用a。 由于参照透明度如果您这样做并且使用名称a或者始终写入复杂的表达式,那么它对程序的意义无关紧要。因此,该原则保证名称及其定义的含义与“2的前任”和“0的后继者”与1相同,即相同。