Sono un po 'confuso su polimorfismo debole in OCaml.Polymorphism debole in OCaml
vedere il seguente frammento di codice, dove mi definisco una funzione remember
:
let remember x =
let cache = ref None in
match !cache with
| Some y -> y
| None -> cache := Some x; x
;;
Il compilatore può dedurre il tipo polimorfico 'a -> 'a
, e cache
viene utilizzato a livello locale.
Ma quando modifico il codice sopra in
let remember =
let cache = ref None in
(fun x -> match !cache with
| Some y -> y
| None -> cache := Some x; x)
;;
il compilatore deduce il tipo debolmente polimorfico '_a -> '_a
, anche, sembra che cache
è condivisa attraverso invocazioni di remember
.
Perché il compilatore deduce qui un tipo debolmente polimorfico e perché è cache
condiviso?
Per di più, se cambio nuovamente il codice
let remember x =
let cache = ref None in
(fun z -> match !cache with
| Some y -> z
| None -> cache := Some x; x)
;;
il compilatore deduce il tipo polimorfico 'a -> 'a -> 'a
e cache
si abitua a livello locale. Perché è così?
Immagino che intendiate che 'cache' ha tipo 'int opzione ref' e non' ref (None int) '. – Virgile
@Virgile Giusto, troppo haskell – jozefg