以下がScalaで可能である:すなわちScalaのコンストラクタ抽象
scala> val l = List
l: scala.collection.immutable.List.type = [email protected]
scala> l (1, 2, 3)
res0: List[Int] = List(1, 2, 3)
、Scalaはより高次の多型を有します。私は次のことを行うために高次多型を使用したいと思います。
sealed abstract class A { def eval() : A }
case class A0() extends A { ... }
case class A1 (a : A) extends A { ... }
case class A2 (a : A, b : A) extends A { ... }
....
だから私は、コンストラクタの引数必ずしも同じ番号を取らない場合クラス、A
のサブクラス、の束を持っています。アイデアはApplyA
は、最初の引数としてA
のサブタイプ、および引数のリストである何かのためのコンストラクタを取るということです
case class ApplyA (c : ???, l : List [ A ]) extends A {
def eval() : A = { ??? } }
:私はまた、「一般的な」ケースクラス、このような何かを持っていると思います。 eval
メソッドは、可能であればコンストラクタで適切なクラスを構築し(リストの長さが正しい)、 (これは上記のList
の例ではl (1, 2, 3)
に相当)を返します。 の最初のコンストラクタの引数の型はどうなりますか?
これは高次の多型で可能であるはずですが、どのように動かすことができませんでした。私は高次の多形性を使わなくても、単にコンストラクタを関数にラップし、次にこれらの関数をコンストラクタの最初の引数としてApplyA
に渡すだけで、これを行うことができますが、高次の多型を直接使用する方法を理解したいと思います。