Один из вариантов полиморфный вариант . Вы можете определить тип списка, используя:
# type mylist = [`I of int | `S of string] list ;;
type mylist = [ `I of int | `S of string ] list
Затем определите значения, такие как:
# let r : mylist = [`I 10; `S "hello"; `I 0; `S "world"] ;;
val r : mylist = [`I 10; `S "hello"; `I 0; `S "world"]
Вы должны быть осторожны, чтобы добавлять аннотации типов, потому что полиморфные варианты являются "открытыми" типами. Например, законно следующее:
# let s = [`I 0; `S "foo"; `B true]
val s : [> `B of bool | `I of int | `S of string ] list =
[`I 0; `S "foo"; `B true]
Чтобы запретить типу списка разрешать нецелочисленные или строковые значения, используйте аннотацию:
# let s : mylist = [`I 0; `S "foo"; `B true];;
This expression has type [> `B of bool ] but is here used with type
[ `I of int | `S of string ]
The second variant type does not allow tag(s) `B