2010-11-22 31 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」)中指出的兩個問題。

相關問題