私は Scala でリレーショナル代数をエンコードしようとしてきました (私の知る限り、Scala は最も高度な型システムの 1 つです)、目的の場所に到達する方法が見つからないようです。
私はプログラミング言語設計の学問分野の経験があまりないので、どの機能を探すべきかよくわかりません。
では、静的に検証されたリレーショナル代数を実装するには、どの言語機能が必要で、それらの機能を備えているのはどの言語でしょうか?
要件の一部: Tuple は、静的に定義された問題のタプルの有効な名前のセットから、名前で指定された型の値に名前をマッピングする関数です。この name-type セットをドメインと呼びましょう。
リレーションは、タプルの範囲がセット内で一意であるように、同じドメインを持つタプルのセットです。
これまでのところ、モデルは簡単に Scala でモデル化できます。
trait Tuple
trait Relation[T<Tuple] extends Set[T]
Tuple の vals、vars、および defs は、上で定義した名前と型のセットです。しかし、Tuple に同じ名前の定義が 2 つあるはずはありません。また、vars と不純な定義もおそらく制限されるべきです。
トリッキーな部分は次のとおりです。
2 つのリレーションの結合は、タプルのドメインがオペランド タプルのドメインの和集合であるリレーションです。ドメインの共通部分の範囲が同じタプルのみが保持されるようにします。
def join(r1:Relation[T1],r2:Relation[T2]):Relation[T1 with T2]
トリックを行う必要があります。
Relation の射影は、タプルのドメインがオペランド タプル ドメインのサブセットである Relation です。
def project[T2](r:Relation[T],?1):Relation[T2>:T]
これは、解決策を見つけることさえ可能かどうかわからないところです。どう思いますか?プロジェクトを定義するために必要な言語機能は何ですか?
上記のオフコースで暗示されているのは、API が使用可能でなければならないということです。定型文のレイヤーとレイヤーは受け入れられません。