ocaml - 为什么推断的类型在 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 转换会导致类型推断如此不同?
解决方案
区别在于值限制,它不允许第一个定义是多态的:它是由应用程序定义的,它不是一个值。第二种形式被定义为一个函数,它是一个值。该符号'_weakN
表示尚未解析的单态类型,而不是像'a
.
有关更多背景信息,请参阅本章。
推荐阅读
- wordpress - Wordpress CPT UI 和 ACF 自定义字段
- php - GET 的 FOSRestBundle 注释
- ios - 如何将 tableview 单元格保存到 UserDefaults 然后显示它
- c# - 如何最好地处理 C# 中的位数据?
- css - 网格显示列的宽度不相等
- android - 如何抑制 Gradle 自动将 vectorDrawable 转换为 PNG?
- c++ - C++ 如何从 ifstream 和 getline() 中获取子字符串
- css - 在 CSS ::selection 中保持继承背景
- c# - 使用应用程序池标识在 IIS 上的 ASP.NET 中查询 Win32_Printer 时权限被拒绝
- html - 将框重新对齐为 2x3