'a
和'_l
有什么区别?'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
'a
和'_l
有什么区别?'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
_
表示弱多态变量:它是在其不能一概而论的位置。
有关OCaml FAQ中弱多态性的两种解释:请参阅A function obtained through partial application is not polymorphic enough和下一个。
当您使用非本地引用(其类型不能泛化)或者定义不是语法函数的多态函数(它们不是以fun x -> ..
而是函数应用程序开头)时,通常会发生这种情况。在某些情况下,有一个简单的解决方法(eta-expansion,请参阅常见问题解答),有时候没有,有时候你的程序不完善。
一个简单的例子:let a = ref []
没有得到多态性a list ref
类型。否则,您可以将这两者用作int list
和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 = []}
对于值限制了深入的解释和“放松”值限制在OCaml的类型检查实际执行,看到Relaxing the Value Restriction纸由Jacques常绿矮灌木丛(2004年)。
编译器的错误消息中存在弱类型变量,但我不确定弱变量是否与错误有关(我没有看到类型变量的状态如何成为此原因信息)。
你确定你没有定义两种类型polynomial
?这就是在FAQ中回答他的问题(“Error message: a type is not compatible with itself”)中指出的两个问题。