メンバー型がScalaでどのように機能するのか、型をどのように関連付けるべきかを知りたいと思います。型パラメータとScala型のメンバー型
1つのアプローチは、関連付けられたタイプをタイプパラメータにすることです。このアプローチの利点は、タイプの分散を処方できることです。サブタイプがタイプを変更しないことを確信できます。欠点は、関数の型から型パラメータを推論できないということです。
第2のアプローチは、私はサブタイプ関連するタイプに境界を規定することができないので、私は、関数パラメータの型を使用できないという問題を有している関連型の第2種類の部材を作製することです具体例は次のようになり
:(X、X位のTがxTの有する任意の関連しないかもしれないときにX):
Iは
trait DFA[S] { /* S is the type of the symbols in the alphabet */
trait State { def next(x : S); }
/* final type Sigma = S */
}
(typeパラメータなしであってもよい)のDFAのための形質を有します
と実行するための関数を作成したいこの入力シーケンスの上にDFA、と私は
- 機能は、入力シーケンスの種類としては何も
<% Seq[alphabet-type-of-the-dfa]
を取る必要がありますしたい 型パラメータを指定する必要はありません、関数呼び出し側は、すべてを推測しなければならない
- 私は思います具体的なDFA型で呼び出す関数と同じです(ただし、DFAの型パラメータを持たない解決策があれば問題ありません)。
- アルファベットの型は拘束されていない必要があります。
def runDFA[S, D <: DFA[S], SQ <% Seq[S]](d : D)(seq : SQ) = ....
この作品:私はこれを試したサブタイプではありません異なるアルファベットタイプで
シャアのためだけでなく、未知のユーザ定義クラスのDFA)
def runDFA[D <: DFA[S] forSome { type S }, SQ <% Seq[D#Sigma]](... same as above
これは私も、型パラメータを削除抽象型シグマを作成し、その型を結合しようとした
(Dを???(それは何ですか?)を入力するには、無効な循環参照を)動作しませんでした具体的なクラスではrunDFAは
def runDFA[D <: DFA, SQ <% Seq[D#Sigma]](... same as above
ようになりますが、これは必然的に同様の問題に遭遇し、 "型の不一致:dfa.Sigma
を期待し、D#Sigma
だ"
任意のアイデア?ポインタ?
編集:
答えがこれを行うための簡単な方法がない示しているように、誰かがそれは不可能であり、何がそれが働いたように変更しなければならないであろう理由で、より手の込んだだろうか?
私がrunDFAをフリー関数(メソッドではない)にしたい理由は、オートマトンの最小化、標準的な言語操作、NFAからDFAへの変換、言語分解などの他の同様の関数を必要とし、このクラス内のクラスは、オブジェクト指向設計のほぼすべての原則に反しています。
うわー、あなたはこれを意味すると思った:http://www.huygens-fokker.org/scala/ – MusiGenesis