クラス継承が「開いた」型階層であり、識別共用体が「閉じた」型階層であることはよく知られています。ただし、新しいサブクラスを追加するのは簡単ですが、新しい仮想関数を追加するには、既存のすべてのクラスを変更する必要があります。一方、判別共用体は新しい機能を簡単に追加できます。
| inheritance | discriminated union
new type | easy | hard
new function | hard | easy
OOP は、「型階層に新しいメソッドを追加する」という難しさを経験してきたほど十分に存在しており、「すべてのクラスを変更する」ことが適切な選択肢ではない場合、Visitor パターンのようなものを考え出しました。既存のタイプに新しい機能を追加します。
例えば:
class Base Base.f() Base.g()
class A : Base A.f() A.g()
class B : Base B.f() B.g()
仮想を追加するのBase.h()
は難しいため、ビジター パターンを使用して、将来の機能をカプセル化できるようにします。これは基本的に、パターンマッチ関数の継承ベースのアナログです!
class H : BaseVisitor {
visit(A) { }
visit(B) { }
}
// this looks really similar to:
let H something =
match something with
| A -> ..
| B -> ..
TLDR:判別共用体への型の追加を扱う一般的に見られる抽象化 (Visitor パターンに類似) はありますか?