Il seguente è possibile in Scala:Scala costruttore astrazione
scala> val l = List
l: scala.collection.immutable.List.type = [email protected]
scala> l (1, 2, 3)
res0: List[Int] = List(1, 2, 3)
In altre parole, Scala ha ordine superiore polimorfismo. Mi piacerebbe usare il polimorfismo di ordine superiore per fare quanto segue.
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 { ... }
....
quindi ho un sacco di classi case, sottoclassi di A
, i cui costruttori non necessariamente prendere lo stesso numero di argomenti. Mi piacerebbe anche avere una 'generica' classe caso, qualcosa di simile:
case class ApplyA (c : ???, l : List [ A ]) extends A {
def eval() : A = { ??? } }
L'idea è che ApplyA
prende come primo argomento un costruttore per qualcosa che è un sottotipo di A
, e un elenco di argomenti. Il metodo eval
quindi costruisce una classe appropriata con il costruttore, se possibile (ovvero l'elenco ha la lunghezza giusta) e lo restituisce (questo corrisponde a l (1, 2, 3)
nell'esempio List
precedente). Quale sarebbe il tipo di argomento del primo costruttore per ApplyA
?
Questo dovrebbe essere possibile con il polimorfismo di ordine superiore, ma non ho potuto capire come. So che posso farlo anche senza usare il polimorfismo di ordine superiore semplicemente avvolgendo i costruttori in funzioni e poi passando queste funzioni come primo argomento al costruttore per ApplyA
, ma mi piacerebbe capire come usare direttamente il polimorfismo di ordine superiore.