【问题标题】:How to name the "=" of a Haskell expression?如何命名 Haskell 表达式的“=”?
【发布时间】:2016-05-14 21:39:03
【问题描述】:
let a = 3

意思是:

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

如果 Haskell 中的一切都是函数,那么我可以在这里说 a 也是函数吗?但是函数是可以调用的,怎么叫a呢?

【问题讨论】:

  • 我投票决定将此问题作为题外话结束,因为您无法通过在 SO 上询问新语言的最基本基础知识来学习它们。这就是教程的用途。
  • LET a BE 3. 我们给一个值一个名字,这就是全部。
  • @dfeuer 我觉得这是一个很好的问题,它表明 OP 想要理解一些东西。您和我对如何学习的想法可能与 OP 处理事物的方式不同。这并没有改变这样一个事实,即问题涉及一个重要的概念——参照透明性——我们不应该太早厌倦一次又一次地解释它。只是我的 0,02€
  • 我也想知道为什么“一切都是 haskell 中的函数”在这里如此自信地陈述,而这显然是错误的......但是,我看到很多人都这么想。为什么这种情况如此普遍?是否有一些资源声称 haskell 中的所有内容都是函数?为什么人们首先会相信或想到这一点? :|每个人都必须从某个地方得到这个。

标签: haskell semantics


【解决方案1】:

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

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

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

编辑:正如其他一些答案所指出的那样,“分配”这个词往往意味着某种程度的可变性,而 Haskell 没有。因此,我建议不要使用最后一个短语。

【讨论】:

  • Haskell 通常没有我称之为“字节码”的任何东西。
  • @SebastianRedl,是的,当时我想不出更好的词。我解决了这个问题。
【解决方案2】:
let a=3

"构造一个名为 a 的对象"

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

"将值 3 绑定到对象 a"

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

"给变量a赋值"

不,“赋值”通常意味着可以改变变量的值,而在纯函数式编程中并非如此。

就我个人而言,我只是将let a = 3 读作“将a 定义为3”。在 Haskell 中,大多数时候,我们对变量的值进行推理,而不管这些值何时被构造/分配/垃圾收集以及这些值在内存中的精确表示方式。所以,我们通常避免去思考一个程序是如何在操作上执行的,而更多地关注结果是“什么”,以及它是否是预期的结果(“指称”)。

当然,在获得预期结果之后,我们确实开始关心程序的性能。为此,我们至少需要大致了解程序的“执行方式”、内存分配等。

【讨论】:

  • 我认为“绑定到名称”在 Haskell 中绝对比“绑定到变量”更合适...
  • @ErikAllik 可能是这样。我有时将“变量”视为“具有范围的名称”,其中“名称”只是一个字符串/句法标识符。无论如何,我编辑了。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    意思是:

    “构造一个名为a的对象”或“将值3绑定到对象a”或“赋值” 变量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) 是 新闻中的阿吉安。 ATF 的负责人 Drink A'Glass 在一份声明中说 采访说,当你不能抽好烟时,单独喝啤酒是不行的 同时。 ...

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

    let a = sqr . fst . f $ xs
    

    以后我们可以使用a。 由于引用透明,如果你这样做并使用名称a 或一直编写复杂的表达式,那么程序的含义并不重要。因此,该原则保证了名称的含义及其定义与“2的前任”和“0的继任”与1相同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-02
      • 2014-04-08
      • 2014-06-11
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      相关资源
      最近更新 更多