N
Size: a a a
N
E
E
KC
E
К
OD
OP
OP
OD
К
В
λƒ
AD
К
AS
AS
AS
Inl/Inr, в принципе это решает проблему + есть проверка компилятором на полноту матчинга, но выглядит немного криво:type Type = Foo :+: Bar :+: Qoo :+: CNilПонимаю как сделать объекты с unapply, чтобы получилоcь что-то типа:
def handler1(g: Group): Unit = g match {
case Inl(foo) => ???
case Inr(Inl(bar)) => ???
case Inr(Inr(Inl(qoo))) => ???
case Inr(Inr(Inr(cnil))) => cnil.impossible
}
def handler2(g: Group): Unit = {
val GetFoo = GetElement[Foo]
val GetBar = GetElement[Bar]
val GetQoo = GetElement[Qoo]
g match {
case GetFoo(foo) => ???
case GetBar(bar) => ???
case GetQoo(qoo) => ???
}
}
или обощенного обработчика в который "добавляются" обработчики для конкретного типа: def handler3(g: Group): Unit = {
val hnd = new HandlerBuilder[Unit]
.add[Foo](_ => ())
.add[Bar](_ => ())
.add[Qoo](_ => ())
.result()
hnd(g)
}
Но тут теряется проверка на полноту, то обработали все кейсы на этапе компиляции. Ну и еще вариант писать через Selector, который возращает Option. AD
Inl/Inr, в принципе это решает проблему + есть проверка компилятором на полноту матчинга, но выглядит немного криво:type Type = Foo :+: Bar :+: Qoo :+: CNilПонимаю как сделать объекты с unapply, чтобы получилоcь что-то типа:
def handler1(g: Group): Unit = g match {
case Inl(foo) => ???
case Inr(Inl(bar)) => ???
case Inr(Inr(Inl(qoo))) => ???
case Inr(Inr(Inr(cnil))) => cnil.impossible
}
def handler2(g: Group): Unit = {
val GetFoo = GetElement[Foo]
val GetBar = GetElement[Bar]
val GetQoo = GetElement[Qoo]
g match {
case GetFoo(foo) => ???
case GetBar(bar) => ???
case GetQoo(qoo) => ???
}
}
или обощенного обработчика в который "добавляются" обработчики для конкретного типа: def handler3(g: Group): Unit = {
val hnd = new HandlerBuilder[Unit]
.add[Foo](_ => ())
.add[Bar](_ => ())
.add[Qoo](_ => ())
.result()
hnd(g)
}
Но тут теряется проверка на полноту, то обработали все кейсы на этапе компиляции. Ну и еще вариант писать через Selector, который возращает Option. AD