首页 > 解决方案 > 为什么推断的类型在 let f = List.map fst 与 let gx = List.map fst x 之间有所不同

问题描述

在 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 转换会导致类型推断如此不同?

标签: ocaml

解决方案


区别在于值限制,它不允许第一个定义是多态的:它是由应用程序定义的,它不是一个值。第二种形式被定义为一个函数,它是一个值。该符号'_weakN表示尚未解析的单态类型,而不是像'a.

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


推荐阅读