Ocaml 为什么let f=List.map fst与let g x=List.map fst x之间的推断类型不同

Ocaml 为什么let f=List.map fst与let g x=List.map fst x之间的推断类型不同,ocaml,Ocaml,在OCaml中,推断出的 let f=List.map fst 是 是 val g:('a*'b)列表->'a列表= (类型取自utop) 因此,f不能多态使用,而g可以多态使用 为什么纯函数之间的eta转换会导致类型推断上的差异?这种差异是由于值限制造成的,它不允许第一个定义是多态的:它是由应用程序定义的,而不是值。第二种形式被定义为一个函数,它是一个值。符号“u weakN表示尚未解析的单态类型,而不是多态类型变量,如'a 有关更多背景信息,请参阅。我认为它是完全相同的类型,只是对类型变

在OCaml中,推断出的

let f=List.map fst

val g:('a*'b)列表->'a列表=
(类型取自utop)

因此,
f
不能多态使用,而
g
可以多态使用


为什么纯函数之间的eta转换会导致类型推断上的差异?

这种差异是由于值限制造成的,它不允许第一个定义是多态的:它是由应用程序定义的,而不是值。第二种形式被定义为一个函数,它是一个值。符号
“u weakN
表示尚未解析的单态类型,而不是多态类型变量,如
'a


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

我认为它是完全相同的类型,只是对类型变量使用了不同的名称。似乎在ocaml类型系统中,
“\u weak1
具有特殊的含义。如果你尝试做
f[(1,0);(2,0)];;f[(“a”,0);(“b”,0)]
,类型检查器将失败,但是
g[(1,0);(2,0)];;g[(“a”,0);(“b”,0)]
非常感谢!我想我大体上理解了,但是我被“它是由一个应用程序定义的,而不是一个值”这一点弄糊涂了-这是否意味着
List.map fst
不是一个值?从语法意义上讲,值不是一个值,应用程序不是一个值,它是一个计算值的表达式。另一方面,lambda是一个语法值(函数类型)。
val f : ('_weak1 * '_weak2) list -> '_weak1 list = <fun>
val g : ('a * 'b) list -> 'a list = <fun>