data Odd : Type -> Type -> TypeNon-empty list, starting and ending with an a, where adjacent elements alternate
between types a and b.
We can think of this type as:
- A fence, with the `a`s as fence-posts, and the `b`s as panels.
- A non-empty list of `a`s, separated by `b`s
- A list of `b`s, separated by, and surrounded by, `a`s
- The free extension of a monoid `a`, with variables in `b`
(::) : a -> Even b a -> Odd a bMonoid a => Alternative (Odd a)Monoid a => Applicative (Odd a)Bifoldable OddBifunctor OddBitraversable OddEq a => Eq b => Eq (Odd a b)Foldable (Odd a)Functor (Odd a)Monoid a => Monoid (Odd a b)Ord a => Ord b => Ord (Odd a b)Semigroup a => Semigroup (Odd a b)Show a => Show b => Show (Odd a b)Traversable (Odd a)data Even : Type -> Type -> TypeA list, starting with an a, and ending with a b; where adjacent elements
alternate between types a and b.
Equivalent to List (a, b)
Nil : Even a b(::) : a -> Odd b a -> Even a bBifoldable EvenBifunctor EvenBitraversable EvenEq a => Eq b => Eq (Even a b)Monoid (Even a b)Ord a => Ord b => Ord (Even a b)Semigroup (Even a b)Show a => Show b => Show (Even a b)(++) : Odd a b -> Odd b a -> Even a b(++) : Even a b -> Odd a b -> Odd a b(++) : Even a b -> Even a b -> Even a b(++) : Odd a b -> Even b a -> Odd a b(+>) : Semigroup a => Odd a b -> a -> Odd a b(<+) : Semigroup a => a -> Odd a b -> Odd a bsingleton : a -> Odd a bflatten : Odd (Odd a b) b -> Odd a b(>>=) : Monoid a => Odd a b -> (b -> Odd a c) -> Odd a c(>>=) : Odd a c -> (a -> Odd b c) -> Odd b codds : Odd a b -> List aevens : Even a b -> List bevens : Odd a b -> List bodds : Even a b -> List aforget : Odd a a -> List aforget : Even a a -> List a