9

私は 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 が使用可能でなければならないということです。定型文のレイヤーとレイヤーは受け入れられません。

4

2 に答える 2

6

あなたが求めているのは、タイプを他の2つのタイプ(元の関係と射影定義)の違いとして構造的に定義できるようにすることです。私は正直にあなたがそれをすることを可能にするどんな言語も考えることができません。はとの両方の構造サブタイプであるため、タイプは構造的に累積することができます(A with B)。ただし、考えてみると、型操作は実際にはサブタイプではなく、のスーパータイプになります。自然に共変するタイプについて、任意の反変のタイピング関係を求めています。ある種のものが名目上の実存型、ましてや構造的宣言点型で健全であるということさえ証明されていません。A with BABA less BA

私は以前にこの種のモデリングに取り組んだことがあり、私が取ったルートは、予測を3つのドメインの1つに制約することでした:P== TP== {F} where F in TP== {$_1} where $_1 anonymous。1つ目は、射影が入力タイプと同等である場合です。つまり、no-op(SELECT *)です。2つ目は、射影は入力タイプに含まれる単一のフィールドであるということです。3番目はトリッキーなものです。入力型と静的な関係$_1のない匿名型の宣言を許可しているということです。おそらく、入力タイプに委任するフィールドで構成されますが、それを強制することはできません。これは、おおよそLINQが採用する戦略です。

申し訳ありませんが、これ以上お役に立てることはありません。私はあなたが求めていることをすることが可能であったことを望みます、それは多くの非常にきちんとした可能性を開くでしょう。

于 2008-10-04T17:04:32.190 に答える
0

プロジェクト部分のマッピング収集には通常の機能を使用するだけで落ち着いたと思います。クライアントは関数を指定するだけです[T<:Tuple](t:T) => P

PIのクラスに到達するためのいくつかのJavaトリックにより、リフレクションを使用してクエリロジックを実装できるはずです。

結合には、おそらく DynamicProxy を使用してマッピング関数を実装します。

おまけとして、API を Scala の特別な for 構文で使用できるようにすることができるかもしれません。

于 2008-10-07T21:42:46.980 に答える