eine Reihe von ADT gegeben, die Zum Beispiel zwei verschiedene Untersätze haben:Scala mit unförmigen höher kinded Koprodukte über eine natürliche Transformation zu kombinieren
sealed trait Domain[Y]
sealed trait Command[Y] extends Domain[Y]
sealed trait Query[Y] extends Domain[Y]
case class Add(value:String) extends Command[Ack]
case class Remove(value:String) extends Command[Ack]
case class Exists(value:String) extends Query[Boolean]
case object List extends Query[List[String]]
Jetzt nehme ich habe zwei natürliche Transformationen, für einige willkürliche Monade M [_]:
val commandHandler:Command ~> M
val queryExecutor:Query ~> M
möchte ich irgendwie diese beiden natürlichen Transformationen zu einer einzigen Transformation kombinieren:
val service:Domain ~> M = union(commandHandler, queryExecutor)
Allerdings haben wir Schwierigkeiten, mit höherwertigen Koprodukten aus dem Startblock zu kommen. Selbst ein Punkt in die richtige Richtung wäre in diesem Stadium hilfreich.
die sicherlich verschiebt verschiebt das Problem auf einen einfacheren Ort, wo es braucht eine Domäne zuordnen -> Xor.Left [Befehl] oder Xor.Right [Abfrage]. Das könnte grob mit Typetags erreicht werden, aber die Vorteile des Adt wäre besser –
Sie können einfach ein anderes '~>' erstellen, um auf den 'Domain'-Typ zu arbeiten, wenn Sie möchten, wie in meiner Bearbeitung gezeigt – Markus1189