区分联合类型的值的正确名称是什么?

What is the correct designation for values of discriminated union types?

考虑这个类型定义:

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. "具有(内部值?关联值?...)1 的类型 ChoiceTwo 的值 A 构造..."

我想选项 3 最能描述这种情况,但我如何才能正确指定值 1 相对于类型 ChoiceTwo 的(其他?)值 A?

这都是吹毛求疵。没有人真正关心在大学测验之外如何准确地说出这些话,即便如此,我还是建议您转学到另一所大学 :-)

但如果你真的想劈头发,我们开始吧。

在您的第一个示例中,值 A 不是“构造的”。由于它没有参数,它的实例只能有一个,而且那个实例一直存在,所以没有必要去“构造”它。 可以肯定的是,A可能仍然被称为“构造函数”,但它同时也是一个“值”。

在第二个例子中,有时说“构造了一个值A 1”,但更多时候是“构造了一个值A 构造参数 1"

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

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

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