如果我为高阶函数指定(我认为)正确的类型,OCaml 编译器会拒绝该函数的第二次使用。
编码
let foo ():string =
let f: ('a -> string) -> 'a -> string = fun g v -> g v
in let h = string_of_int
in let i = string_of_float
in let x = f h 23
in let y = f i 23.0
in x ^ y
导致以下错误消息
文件“test.ml”,第 6 行,字符 14-15: 错误:此表达式的类型为 float -> string 但是需要一个 int -> string 类型的表达式
所以第一次使用f
似乎将其第一个参数的类型固定为int -> string
. 我能理解。但我没有得到的是省略类型限制来f
解决问题。
let foo ():string =
let f g v = g v
in let h = string_of_int
in let i = string_of_float
in let x = f h 23
in let y = f i 23.0
in x ^ y
转移f
到全局范围也解决了这个问题:
let f: ('a -> string) -> 'a -> string = fun g v -> g v
let foo ():string =
let h = string_of_int
in let i = string_of_float
in let x = f h 23
in let y = f i 23.0
in x ^ y
为什么第一个示例不编译而后面的示例编译?