Je suis un peu confus au sujet du polymorphisme faible dans ocaml em>. Veuillez consulter l'extrait suivant, où je définis une fonction N'oubliez pas p>
let remember x =
let cache = ref None in
(fun z -> match !cache with
| Some y -> z
| None -> cache := Some x; x)
;;
3 Réponses :
Cela semble faire avec la restriction de la valeur. La restriction de la valeur totale (comme dans SML) rejeterait votre code complètement. Les types faiblement polymorphes sont décrits dans le papier "Relaxant la restriction de la valeur" de Jacques Garrigue, que je viens de tomber sur votre question après avoir lu votre question: p>
http://caml.inria.fr/pub/papers/garrigue-value_restriction-fiwflp04 .pdf p>
Le fait que cache code> est partagé entre les invocations devrait être évident si vous avez un modèle mental correct de ce que signifie code ML. Vous définissez deux valeurs,
N'oubliez pas code> et
cache code>. La nidification rend simplement la portée de
cache code> privé au bloc. P>
> remember 1 1
Je suppose que vous vouliez dire que cache code> a type
int option réf code> et non
ref (aucun int) code>.
let remember = let cache = ref None in (fun x -> match !cache with | Some y -> y | None -> cache := Some x; x)
Votre «autre version» résout le code qui m'a empêché de penser à la majeure partie de l'après-midi d'hier!