在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
这样的多态类型变量。
有关更多背景信息,请参阅本章。