弱い多型に関して少し混乱しています。OCamlです。コンパイラは、ポリモーフィック型の'a -> 'a
を推測することができ、かつcache
が局部的に使用されているOCamlの弱い多型
let remember x =
let cache = ref None in
match !cache with
| Some y -> y
| None -> cache := Some x; x
;;
:
私は機能remember
を定義し、次のスニペットを参照してください。
しかし、私は
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
がローカルで使用状態になる多相型を推論します。これはなぜですか?
'cache'は' ref(None int) 'ではなく' int option ref'型を持っていると思います。 – Virgile
@Virgileあまりにも多くのhaskell – jozefg