Per questo è possibile utilizzare senza forma Generic
.
val t: Test = ???
val a: Answer = ???
val gt = Generic[Test]
val ga = Generic[Answer]
val gta = Generic[TestWithAnswers]
val ta = gta.from(gt.to(t) ++ ga.to(a))
o bene, se si dispone di una cosa per one-liners
val ta = Generic[TestWithAnswers].from(Generic[Test].to(t) ++ Generic[Answer].to(a))
forniti t
è un esempio di Test
e a
è un'istanza di Answer
, ta
sarà un'istanza di TestWithAnswers
.
Una spiegazione rapida: Generic
può convertire una classe di casi in e da una rappresentazione generica HList
. Quindi, data la struttura delle tue classi, puoi semplicemente convertire sia il test che la risposta in una hlist, concatenare i due elenchi in uno solo e creare un'istanza TestWithAnswers
da esso.
Ecco un esempio più semplice, che è possibile copiare-incollare e provare in un REPL
import shapeless._
case class A(a: Int)
case class B(a: String)
case class AB(a: Int, b: String)
Generic[AB].from(Generic[A].to(A(42)) ++ Generic[B].to(B("foo")))
// AB(42, "foo")
fonte
2015-07-28 16:21:33
vuoi dire val ta = gta.from (gt.to (t) ++ at.to (a)) invece di val ta = gta.from (gt.to (t) ++ gt.to (a))? Anche quando apporto questa modifica, il codice non viene ancora compilato. Sembra che l'operatore ++ non sia un membro di gt.to (t). qualche idea? Grazie – azuras
Grazie anche per la spiegazione di Generic. Molto utile. – azuras
@azuras, sì che l'errore è già stato corretto. Hai importato tutto informe? Ho eseguito il codice in un repl e ha funzionato –