OCaml: Liste pouvant contenir deux types?
Question
Au lieu de spécifier une liste int ou une liste de chaînes, pourrais-je spécifier une liste dont les membres doivent être des chaînes ou des entiers, mais rien d'autre?
La solution
Vous pourriez faire:
type element = IntElement of int | StringElement of string;;
puis utilisez une liste d'éléments d'élément
.
Autres conseils
Une des options est variants polymorphes . Vous pouvez définir le type de liste en utilisant:
# type mylist = [`I of int | `S of string] list ;;
type mylist = [ `I of int | `S of string ] list
Définissez ensuite des valeurs telles que:
# let r : mylist = [`I 10; `S "hello"; `I 0; `S "world"] ;;
val r : mylist = [`I 10; `S "hello"; `I 0; `S "world"]
Vous devez cependant veiller à ajouter des annotations de type, car les variantes polymorphes sont "ouvertes". les types. Par exemple, ce qui suit est légal:
# 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]
Pour empêcher le type d'une liste d'autoriser des valeurs autres que des entiers ou des chaînes, utilisez une annotation:
# 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow