2010-11-22 29 views
10

'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 

回答

23

_表示弱多态变量:它是在其不能一概而论的位置。

有关OCaml FAQ中弱多态性的两种解释:请参阅A function obtained through partial application is not polymorphic enough和下一个。

当您使用非本地引用(其类型不能泛化)或者定义不是语法函数的多态函数(它们不是以fun x -> ..而是函数应用程序开头)时,通常会发生这种情况。在某些情况下,有一个简单的解决方法(eta-expansion,请参阅常见问题解答),有时候没有,有时候你的程序不完善。

一个简单的例子:let a = ref []没有得到多态性a list ref类型。否则,您可以将这两者用作int listbool 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年)。

1

编译器的错误消息中存在弱类型变量,但我不确定弱变量是否与错误有关(我没有看到类型变量的状态如何成为此原因信息)。

你确定你没有定义两种类型polynomial?这就是在FAQ中回答他的问题(“Error message: a type is not compatible with itself”)中指出的两个问题。

相关问题