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.3
Depend on bifunctor-classes-compat instead of bifunctors
See changelog note in bifunctors-5.6: https://hackage.haskell.org/package/bifunctors-5.6/changelog
This is breaking change, but affects only GHC-8.0 and older users.
In that case you should check various combinations of newer/older
bifunctors, these, and semialign packages.
1.2.0.1
GHC-9.2 support
1.2
Migrate SemialignWithIndex and ZipWithIndex to this package,
using FunctorWithIndex from indexed-traversable.
Add RepeatWithIndex type-class.
Poly-kinded instances (notably Tagged)
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?