F#类型定义语法

时间:2014-10-25 22:45:57

标签: f#

我正在研究F#的'99问题',并看到NestedList的以下定义:

type 'a NestedList = List of 'a NestedList list | Elem of 'a

我对这里的语法感到有些困惑,因为通常在type之后只有一个类型名称。有人可以澄清一下吗?谢谢!

3 个答案:

答案 0 :(得分:4)

这是精简语法中的discriminated union。你也可以把它写成:

type 'a NestedList =
    | List of 'a NestedList list
    | Elem of 'a

type NestedList<'a> =
    | List of NestedList<'a> list
    | Elem of 'a

这是使用泛型,其中类型本身将另一种类型作为参数。

答案 1 :(得分:3)

F#有两种指定泛型类型的方法:

  • C#/。NET样式 - SomeType<'a, 'b>
  • OCaml / ML风格 - ('a * 'b) SomeType

这些实际上是两种说法相同的方式,可以互换使用。使用哪一个是优先级和代码标准的问题。通常人们将OCaml样式用于基本F#类型,如list,array或option,以及用户定义和BCL样式的C#样式。

答案 2 :(得分:2)

因此,这是具有泛型类型'a的通用区分联合的定义。

关键思想是每个元素都有'a类型。