我对let polymorphism
in感到困惑OCaml
。
考虑以下代码:
A:
let f = (fun v -> v) in
((f 3), (f true))
B:
let f = (fun v -> v) in
((fun g ->
let f = g in
f) f)
C:
let f = (fun v -> v) in
((fun g ->
let f = g in
((f 3), (f true))) f)
对于 A 和 B,没有问题。但是对于C,OCaml
报错:
Error: This expression has type bool but an expression was expected of type
int
因此,对于 A,在评估 时((f 3), (f true))
,f
的类型是'a -> 'a
,对于 B,在评估时let f = g in f
,f
的类型是'a -> 'a
。但是对于 C,在评估 时((f 3), (f true))
,f
的类型是int -> int
。
为什么 Cf
没有 type 'a -> 'a
?
我很难理解OCaml
's
的实现,let polymorphism
如果有人能就这个问题给出一个简明的描述,我将不胜感激。