7
votes

Polymorphisme faible dans OCAML

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)
;;


0 commentaires

3 Réponses :


6
votes

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:

http://caml.inria.fr/pub/papers/garrigue-value_restriction-fiwflp04 .pdf

Le fait que cache 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 et cache . La nidification rend simplement la portée de cache privé au bloc.


0 commentaires

8
votes
> remember 1
  1

1 commentaires

Je suppose que vous vouliez dire que cache a type int option réf et non ref (aucun int) .



1
votes
let remember =
   let cache = ref None in
    (fun x ->  match !cache with
         | Some y -> y
         | None -> cache := Some x; x)

1 commentaires

Votre «autre version» résout le code qui m'a empêché de penser à la majeure partie de l'après-midi d'hier!