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