我对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
在本地使用。为什么会这样?