Sto provando a usare "copiato" senza forma per l'aggregazione dei tipi di errore. Quanto segue è un tentativo di isolare il problema ho attualmente:C'è un modo per estendere le dichiarazioni di tipo?
import shapeless._
case object F1
case object F2
type F12 = F1.type :+: F2.type :+: CNil
case object F3
case object F4
type F34 = F3.type :+: F4.type :+: CNil
type F1234 = F1.type :+: F2.type :+: F3.type :+: F4.type :+: CNil
def custom(f: Either[F12, F34]): F1234 = // how can I declare the resulting type?
f.fold(_.extendRightBy[F34], _.extendLeftBy[F12])
object F1234Handler extends Poly1 {
implicit def caseF1 = at[F1.type](_ => "got F1")
implicit def caseF2 = at[F2.type](_ => "got F2")
implicit def caseF3 = at[F3.type](_ => "got F3")
implicit def caseF4 = at[F4.type](_ => "got F4")
}
custom(Left(Coproduct[F12](F2))).fold(F1234Handler) // got F2
Come posso dichiarare il tipo di risultato nella piega personalizzato senza dover ripetere me stesso? Idealmente non voglio dichiarare F1234 come ho fatto, voglio dichiararlo semplicemente facendo una unione delle due dichiarazioni di tipo esistenti, F12 e F34. In questo modo non ho bisogno di aggiornare la dichiarazione F1234 ogni volta che aggiungo un altro tipo di errore a una di queste dichiarazioni. Posso dichiarare il tipo F1234 = F1.type: +: F2.type: +: F34 ma non posso dichiarare il tipo F1234 = F12: +: F34 a causa della coda CNil di F12, che viene rilasciata dalle operazioni extendBy.
Ciao Travis, grazie per la tua risposta. Avevo individuato Extend ma non riuscivo a capire come farlo funzionare. – sparkle