'a和'_l有什么区别?

Zub*_*ani 11 ocaml

'a和之间有什么区别'_l

我正在看这个错误,无法理解它:

Error: This expression has type ('a -> float polynomial) list but an expression was expected of type float polynomial list derivlist: ('_l ? float polynomial) list
Run Code Online (Sandbox Code Playgroud)

gas*_*che 24

_ 表示弱多态变量:它处于无法推广的位置.

在OCaml FAQ中有两个与弱多态性相关的解释:参见通过部分应用获得的函数不具有多态性,而下一个.

这通常发生在您使用非本地引用(其类型不能一般化)时,或者定义非语法功能的多态函数时(它们不是fun x -> ..以函数应用程序开头而是函数应用程序).在某些情况下,有一个简单的修复(eta扩展,请参阅常见问题解答),有时没有,有时你的程序只是不健全.

一个简单的例子:let a = ref []没有获得多态a list ref类型.否则,你可以同时使用a int list和a bool list,并通过改变引用来混合不同类型的元素.它取而代之的是一种'_a list ref类型.这意味着该类型不是多态的,而只是未知的.一旦你a使用特定类型做某事,它就会'_a一劳永逸地修复.

# let a = ref [];;
val a : '_a list ref = {contents = []}
# let sum_of_a = List.fold_left (+) 0 !a;;
val sum_of_a : int = 0
# a;;
- : int list ref = {contents = []}
Run Code Online (Sandbox Code Playgroud)

有关价值限制和OCaml类型检查器中实际实施的"宽松"价值限制的深入解释,请参阅Jacques Garrigue撰写的" 放宽价值限制"一文(2004年).