【问题标题】:What is the correct designation for values of discriminated union types?区分联合类型的值的正确名称是什么?
【发布时间】:2021-04-08 13:06:24
【问题描述】:

考虑这种类型定义:

type ChoiceOne =
  | A 
  | B 

还有这个绑定

let c1 = A

我假设将其翻译成自然语言的正确方法是“ChoiceOne 类型的值 A 被构造并绑定到名称 c1”

现在看看下一个类型定义和绑定:

type ChoiceTwo =
  | A of int
  | B of float

let c1 = A 1

我现在看到了几种描述这里发生的事情的方式:

  1. “ChoiceTwo 类型的值 A 被构造...”(那么 1 呢?)
  2. “ChoiceTwo 类型的值 1 被构造...”(那么 A 呢?)
  3. “ChoiceTwo 类型的值 A 与(内部值?关联值?...) 1 被构造...”

我猜选项 3 最好地描述了这种情况,但是我怎样才能正确指定值 1 相对于 ChoiceTwo 类型的(其他?)值 A ?

【问题讨论】:

    标签: f#


    【解决方案1】:

    以下是我使用的术语,我相信它已被广泛接受,并以我自己的例子为例:

    type MyDU =
        | A of int
        | B
    
    • A是个案例
    • A 也是一个函数,它接受 int 并返回 MyDU 类型的值
    • 因此,A 1MyDU 类型的值
    • B是个案例
    • B 也是 MyDU 类型的值

    这里唯一需要的词是“case”、“value”、“function”和“type”。不要使用“构造”这个词。一般来说,在谈论 F# 代码时,如果您可以准确地将您使用的任何单词替换为我推荐的单词,那就这样做吧!

    【讨论】:

      【解决方案2】:

      这都是毛骨悚然。没有人真正关心如何在大学测验之外准确地说出这些事情,即使那样,我还是建议您转学到另一所大学:-)

      但是,如果您真的想分叉,我们开始吧。

      在您的第一个示例中,值 A 不是“构造的”。由于它没有参数,所以它只能有一个实例,并且该实例始终存在,因此无需“构造”它。 可以肯定的是,A 可能仍然被称为“构造函数”,但它同时也是一个“值”。

      在第二个示例中,有时会说“构造了一个值 A 1”,但更常见的是“使用参数 1 构造了一个值 A em>"

      【讨论】:

      • 我可以理解你关于分裂头发的观点,但在向 F#(或一般的 FP)新手解释事物时,了解正确的措辞通常非常有用。就像在 C 中你必须向 Java 程序员澄清 while ((*s++ = *t++ )!=0) {;} 这样的事情。
      • 我认为措辞可能很重要,因为在 DU 案例与类型之间经常存在很多混淆,而且许多人确实经常需要口头交流。
      猜你喜欢
      • 1970-01-01
      • 2019-04-12
      • 1970-01-01
      • 2021-08-11
      • 1970-01-01
      • 2014-09-17
      • 2020-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多