La siguiente es posible en Scala:Scala abstracción constructor
scala> val l = List
l: scala.collection.immutable.List.type = [email protected]
scala> l (1, 2, 3)
res0: List[Int] = List(1, 2, 3)
En otras palabras, Scala tiene polimorfismo de orden superior. Me gustaría usar el polimorfismo de orden superior para hacer lo siguiente.
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 { ... }
....
así que tengo un montón de clases de casos, las subclases de A
, cuyos constructores no necesariamente tener el mismo número de argumentos. También me gustaría tener una clase de caso 'genérico', algo como esto:
case class ApplyA (c : ???, l : List [ A ]) extends A {
def eval() : A = { ??? } }
La idea es que ApplyA
toma como primer argumento un constructor para algo que es un subtipo de A
, y una lista de argumentos. El método eval
luego construye una clase apropiada con el constructor si es posible (es decir, la lista tiene la longitud correcta) y la devuelve (esto corresponde a l (1, 2, 3)
en el ejemplo anterior List
). ¿Cuál sería el tipo de argumento del primer constructor para ApplyA
?
Esto debería ser posible con un polimorfismo de orden superior, pero no pude averiguar cómo. Sé que puedo hacer esto incluso sin usar un polimorfismo de orden superior simplemente envolviendo constructores en funciones y pasando estas funciones como primer argumento al constructor para ApplyA
, pero me gustaría entender cómo usar el polimorfismo de orden superior directamente.