'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」)中指出的兩個問題。