我对let polymorphismin感到困惑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如果有人能就这个问题给出一个简明的描述,我将不胜感激。