在 OCaml 中,推断类型
let f = List.map fst
是
val f : ('_weak1 * '_weak2) list -> '_weak1 list = <fun>
而推断的类型
let g x = List.map fst x
是
val g : ('a * 'b) list -> 'a list = <fun>
(取自 utop 的类型)。
因此,f
不能多态使用,而 g
可以。
为什么纯函数之间的 eta 转换会导致类型推断出现如此大的差异?
最佳答案
差异是由于值限制造成的,它不允许第一个定义是多态的:它是由应用程序定义的,而不是值。第二种形式被定义为一个函数,它是一个值。符号 '_weakN
表示尚未解析的单态类型,而不是像 'a
这样的多态类型变量。
参见this chapter了解更多背景。
关于ocaml - 为什么 let f = List.map fst 与 let g x = List.map fst x 之间的推断类型不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57241424/