正如其他人已经指出的那样,从技术上讲,StringConstant
是一个仅有单个案例的带标签联合类型,您可以使用模式匹配提取值。
在谈论F#中的领域建模时,我喜欢使用另一个有用的类比。通常,您可以从简单地说某个数据类型是元组开始:
type Person = string * int
这是一种非常简单的表示数据的方式,但问题在于当你写下
"Tomas", 42
时,编译器并不知道你的意思是
Person
,而是将其理解为
string * int
元组。单例鉴别联合是一种非常好的方式来给你的元组命名。
type Person = Person of string * int
这里使用了两次名称为
Person
的情况可能有点令人困惑,第一次是类型名称,第二次是案例的名称。这没有特殊含义 - 它只是意味着该类型将与案例具有相同的名称。
现在,您可以编写
Person("Tomas", 42)
来创建一个值,并且它将具有类型
Person
。您可以使用
match
或
let
进行分解,但您也可以轻松编写接受
Person
的函数。例如,要返回名称,您可以编写:
let getName (Person(name, _)) =
name
我认为单例判别联合通常被广泛使用,主要是因为它们非常容易定义和使用。然而,在作为公共API暴露的代码中,我不会使用它们,因为它们有点不寻常并可能会令人困惑。
PS:还要注意,在提取值时需要使用括号:
// Correct. Defines symbols 'name' and 'age'
let (Person(name, age)) = tomas
// Incorrect! Defines a function `Person` that takes a tuple
// (and hides the `Person` case of the discriminated union)
let Person(name, age) = tomas