申し訳ありませんが、私の問題に関連するタイトルを見つけるのに苦労しています。
次の動作をモデル化したいと考えています。標準の Scala 型をカプセル化する式を使用して「言語」を設計しました。式は、変数または式のシーケンスのいずれかです。以下では、A は標準の Scala 型 (つまり、Boolean、Int、Double) にすることができます。また、式 (特にシーケンス) で式を他のものに置き換える方法を実装したいと考えています。コンパイルできないコードをいくつか試しました。どのタイプを入れればよいかわからないときに引用符を付けましたが、これはおそらく面倒です。再帰的な性質のために、私はシーケンスのことで特別な問題を抱えています。
sealed trait Expression[A] {
def replace[B](a: Expression[B], b: Expression[B]): Expression[?]
}
trait Variable[A] extends Expression[A] {
def replace[B](a: Expression[B], b: Expression[B]) =
if (a == this) b else this
}
case class Sequence[A <: Expression[B]](values: Seq[A]) extends Expression[A] {
def replace[B](a: Expression[B], b: Expression[B]) =
if (a == this) b
else Sequence(values.map(_.replace(a, b)))
}
もちろん、無限再帰をトリガーするため、シーケンスは非循環的 (シーケンスはそれ自体を含むことはできません) であると想定しています。これらは、n-ary 行列を実装するために使用されます。
ご協力いただきありがとうございます。