Il n'est pas vrai que les variantes polymorphiques sont toujours moins efficaces. En utilisant l'exemple de Martin :
type base = [`String of string | `Int of int]
type t1 = [base | `Bool of bool | `List of t1 list]
type t2 = [base | `Other]
let simplify (x:t1):t2 = match x with
| #base as b -> b
| `Bool _ | `List _ -> `Other
Pour faire cela avec des variantes standard, il faut deux types distincts et un recodage complet, avec les variantes polymorphiques, le cas de base est physiquement invariant. Cette fonctionnalité prend vraiment tout son sens lors de l'utilisation de la récursion ouverte pour la réécriture des termes :
type leaf = [`String of string | `Int of int]
type 'b base = [leaf | `List of 'b list]
type t1 = [t1 base | `Bool of bool ]
type t2 = [t2 base | `Other]
let rec simplify (x:t1):t2 = match x with
| #leaf as x -> x
| `List t -> `List (List.map simplify t)
| `Bool _ -> `Other
et les avantages sont encore plus grands lorsque les fonctions de réécriture sont également factorisées avec une récursion ouverte.
Malheureusement, l'inférence de type Hindley-Milner d'Ocaml n'est pas assez forte pour faire ce genre de chose sans typage explicite, ce qui nécessite une factorisation soigneuse des types, ce qui rend le prototypage difficile. De plus, des coercitions explicites sont parfois nécessaires.
Le gros inconvénient de cette technique est que pour les termes avec plusieurs paramètres, on se retrouve rapidement avec une explosion combinatoire des types plutôt confuse, et à la fin, il est plus facile d'abandonner l'application statique et d'utiliser un type "évier de cuisine" avec des jokers et des exceptions (c'est-à-dire une typage dynamique).
1 votes
Je pense que le nom préféré est maintenant "variantes ouvertes".
3 votes
"La variante ouverte" est clairement plus facile à comprendre intuitivement que "la variante polymorphe"
0 votes
Je pense que "la variante ouverte" fait référence de manière plus précise à des types comme
exn
.0 votes
Enoncé de l'évidence : les ADT simples ne sont pas exactement équivalents en termes de type aux variants polymorphiques : si vous avez besoin des propriétés spécifiques de ces derniers, vous devrez bien entendu les utiliser (c'est-à-dire des ensembles énumérés superposés dans vos types de données, sous-typage via la polymorphie de ligne).
1 votes
Real World Ocaml dispose d'une section entière sur ce sujet.