The major use of These of this is provided by the align member of
Semialign class, representing a generalized notion of "zipping with padding"
that combines structures without truncating to the size of the smaller input.
It turns out that zip operation fits well the Semialign class,
forming lattice-like structure.
Changes
1.1.0.1
Drop base-compat dependency
1.1
Split Semialign into Semialign and Zip.
Rename old Zip into Repeat
i.e. current main hierarchy is
Remove malign, use salign or alignWith mappend where Monoid is necessary.
Add Option instances
instance Functor f => Semialign f where
alignWith :: (These a b -> c) -> f a -> f b -> f c
instance Semialign f => Align f where
nil :: f a
instance Semialign f => Zip f where
zipWith :: (a -> b -> c) -> f a -> f b -> f c
instance Zip f => Repeat f where
repeat :: a -> f a
This biased choice, that Semialign is a super-class of Zip is motivated by the fact that
There’s no Semialign-like class anywhere else, yet
Zip and Repeat are Apply (from semigroupoids) and Applicative with slightly more laws. I
If you need only Repeat class, and your type isn’t Alingable, maybe using Applicative is enough?