Jestem trochę zdezorientowany słabym polimorfizmem w OCaml.Słaby polimorfizm w OCaml
Proszę patrz poniższy fragment, gdzie mogę zdefiniować funkcję remember
:
let remember x =
let cache = ref None in
match !cache with
| Some y -> y
| None -> cache := Some x; x
;;
Kompilator może wnioskować polimorficzne typu 'a -> 'a
i cache
jest używany lokalnie.
Ale kiedy zmodyfikować powyższy kod do
let remember =
let cache = ref None in
(fun x -> match !cache with
| Some y -> y
| None -> cache := Some x; x)
;;
kompilator wywnioskowała słabo polimorficzny typ '_a -> '_a
, również wydaje się, że cache
jest wspólna dla wywołań remember
.
Dlaczego kompilator wypowiada tutaj typ słabo polimorficzny i dlaczego jest udostępniany jako cache
?
Co więcej, gdybym ponownie zmienić kod
let remember x =
let cache = ref None in
(fun z -> match !cache with
| Some y -> z
| None -> cache := Some x; x)
;;
kompilator wnioskuje rodzaj polimorficzny 'a -> 'a -> 'a
i cache
zostaje lokalnie używany. Dlaczego tak jest?
Chyba chodziło o to, że 'cache' ma typ' int opcja ref', a nie 'ref (None int)'. – Virgile
@ Virgile Całkiem dobrze, za dużo maszkli – jozefg