我对OCaml
中的let polymorphism
感到困惑。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
。
为什么C的f
没有类型'a -> 'a
?
我理解OCaml
的 let polymorphism
的实现难度,我就明白了很多,如果任何人都可以给它的简洁 描述关于问题。