我正在玩這個代碼,我不明白的東西。抽象類型convariance/contravariance
type t1 = [ `A ];;
type t2 = [ t1 | `B ] ;;
type t3 = [ t2 | `C ] ;;
module type MT =
sig
type ('a,'b) fct
val create : ('a -> 'b) -> ('a,'b) fct
end;;
module Mt : MT =
struct
type ('a,'b) fct = 'a -> 'b
let create f = f
end;;
let f = (fun x -> x : t2 -> t2) ;;
let af = Mt.create (fun x -> x : t2 -> t2);;
(f :> t1 -> t3);;
(af :> (t1, t3) Mt.fct);;
像這樣,它不起作用,因爲編譯器不知道Mt.fct的類型參數是協變還是逆變。但是,如果你通過替換類型聲明在模塊簽名:
type (-'a,'+b) fct
告訴b是協變的編譯器和逆變,現在它的工作原理。而且因爲我是一個棘手的小惱人的男孩,我試圖向編譯器撒謊,告訴他一個也是協變的!
type (+'a,'+b) fct
他雖然比我聰明,他注意到我在騙他。
Type declarations do not match:
type ('a, 'b) fct = 'a -> 'b
is not included in
type (+'a, +'b) fct
Their variances do not agree.
我的問題是:如果他反正知道類型參數的變化,爲什麼不只是使用我的模塊,而不是迫使我添加這些+和 - 。這又是一個可判定性問題嗎?
'A',B'是什麼? –
這就是你如何定義多態變體。這幾乎就像做類型t = A | B,除了你可以用A和B創建其他類型,從而創建子類型。 –