为什么推断的类型在let f = List.map fst vs let g x = List.map fst x之间有

  • 本文关键字:map let List fst 之间 vs 类型 ocaml
  • 更新时间 :
  • 英文 :


在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 这样的多态类型变量。

有关更多背景信息,请参阅本章。

最新更新