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
ローカルで使用されるようになります。これはなぜですか?