私は可変であることinfo
を必要実現コードOCamlの分散(+ '、-'a)及び不変
module type TS = sig
type +'a t
end
module T : TS = struct
type 'a t = {info : 'a list}
end
のこの部分を書き込んだ後。
私はその後、書いた:
module type TS = sig
type +'a t
end
module T : TS = struct
type 'a t = {mutable info : 'a list}
end
しかし、驚き、
Type declarations do not match:
type 'a t = { mutable info : 'a list; }
is not included in
type +'a t
Their variances do not agree.
をああ、私は分散聞い覚えています。それは約共分散とcontavvarianceについてのものでした。私は勇敢な人です、私は自分の問題だけを見つけるでしょう!
これら2つの興味深い記事(hereとhere)が見つかりました。
私は
module type TS = sig
type (-'a, +'b) t
end
module T : TS = struct
type ('a, 'b) t = 'a -> 'b
end
を書くことができます。しかし、私は疑問に思いました。どのように可変のデータ型は不変であり、共変ではないでしょうか?
つまり、'A list
は私のリストが変更できないため('A | 'B) list
のサブタイプと見なすことができます。同じ機能の場合、タイプが'A | 'B -> 'C
の場合は、タイプが'A -> 'C | 'D
のサブタイプと見なすことができます。'A
と'B
を処理できるのは'A
です。返すだけなので'C
の私は確かに'C
または'D
の(しかし、私は'C
のを得ます)を期待することができます。
しかし、配列については?私が'A array
を持っていれば、配列の要素を'B
に変更すると、本当に('A | 'B) array
であり、もう'A array
ではないので配列型が間違っているので、('A | 'B) array
と考えることはできません。しかしとして('A | 'B) array
はどうでしょうか?はい、私の配列は'B
を含むことができますが、不思議なことに私はそれが関数と同じであると思いました。多分、私はすべてを理解していなかったかもしれませんが、私はそれを理解するのが間に合わなかったので、ここに私の考えを入れたいと思っていました。
TL; DR:
永続:
+'a
機能:
-'a
可変:不変(
'a
)?なぜそれを強制的に-'a
にすることはできませんか?
この投稿は将来のOCaml開発者がこのばらつきの問題を簡単かつ迅速に理解するのに役立つと確信しています。 – Lhooq
私はあなたが "とsetter *タイプとして..."と思った - 編集を提出し、私は間違って修正を得ることはなかった願っています!本当にそれは数分間に合った。 – ELLIOTTCABLE
ええ、間違いなく:)感謝! – ivg