data
    Foo
        a
        b
    = Foo a b

data a :-> b = Arrow (a -> b)

data (f :* g) a = f a :* g a

data
    ( f
        :+ g
    )
        a
    = L (f a)
    | R (g a)

data a `Arrow` b = Arrow' (a -> b)

data (f `Product` g) a = f a `Product` g a

data
    ( f
        `Sum` g
    )
        a
    = L' (f a)
    | R' (g a)
