6
給定一組的ADT具有兩個不同的子集 例如結合:斯卡拉使用不成形更高kinded副產品在改造自然
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]]
現在假設我有兩個自然變換,對於一些任意的單子中號[_]:
val commandHandler:Command ~> M
val queryExecutor:Query ~> M
我想這兩個自然變換莫名其妙地組合成一個單一的轉變:
val service:Domain ~> M = union(commandHandler, queryExecutor)
然而,我們正在努力使具有更高皮的副產品脫穎而出。即使在正確的方向上的一個點將有助於在這個階段。
這肯定轉移轉移的問題,以更容易的地方,在那裏它需要映射域 - > Xor.Left [命令]或Xor.Right [查詢]。這大概可以通過類型標籤來實現,但利用Adt會更好 –
如果您希望如我的編輯中所示,您可以輕鬆地編寫另一個'〜>'來處理'Domain'類型 – Markus1189