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

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

参见this chapter了解更多背景。

关于ocaml - 为什么 let f = List.map fst 与 let g x = List.map fst x 之间的推断类型不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57241424/

相关文章:

regex - OCaml |正则表达式运算符

compiler-construction - 创建编译器 : Learn OCaml or Stick With Java/C/C++

用于类型检查类似于 ML 的模式匹配的算法?

module - OCaml 中的好友模块

Ocaml lwt 永无止境的循环

c - 是否可以从 OCaml 调用 C 函数并有效地传递一个巨大的数组?

ocaml - OCaml 中的副作用和顶级表达式

algorithm - 斐波那契 OCAML 的 N 步代码

ocaml - 扩展 ocamllex 以获取更大的词典

user-interface - OCaml+LablGTK2 : Multi-Line Text Box