Меня немного смущает слабый полиморфизм в OCaml.
См. Следующий фрагмент, в котором я определяю функцию remember
:
let remember x =
let cache = ref None in
match !cache with
| Some y -> y
| None -> cache := Some x; x
;;
Компилятор может определить полиморфный тип 'a -> 'a
, а cache
используется локально.
Но когда я изменил приведенный выше код на
let remember =
let cache = ref None in
(fun x -> match !cache with
| Some y -> y
| None -> cache := Some x; x)
;;
компилятор определяет слабо полиморфный тип '_a -> '_a
, кроме того, похоже, что cache
используется совместно при вызовах remember
.
Почему компилятор определяет здесь слабо полиморфный тип и почему cache
используется совместно?
Более того, если я снова поменяю код
let remember x =
let cache = ref None in
(fun z -> match !cache with
| Some y -> z
| None -> cache := Some x; x)
;;
компилятор определяет полиморфный тип 'a -> 'a -> 'a
, и cache
используется локально. Почему это так?