8. Splitting constructorsΒΆ
We can chose to handle only a subset of the constructors of an EADT by using
splitVariantF.
For instance in the following example we only handle EvenF Int and OddF Int
constructors. The other ones are considered as left-overs:
alg x = case splitVariantF @'[EvenF Int, OddF Int] x of
Right v -> v >:>
( \(EvenF a l) -> "Even : " ++ l
, \(OddF a l) -> "Odd : " ++ l
)
Left leftovers -> "something else"
We can test this code with:
eo :: EADT '[EvenF Int, OddF Int, NilF]
eo = cata evenOdd intList'
eo2 :: EADT '[ConsF Int, EvenF Int, OddF Int, NilF]
eo2 = Even (10 :: Int) $ Odd (5 :: Int) $ Cons (7 :: Int) $ Odd (7 :: Int) Nil
> cata alg eo
"Odd : Even : Odd : something else"
> cata alg eo2
"Even : Odd : something else"
Note that the traversal ends when it encounters an unhandled constructor.