我对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
变成了局部使用。为什么会这样呢?
cache
的类型是int option ref
而不是ref (None int)
。 - Virgile