BSD-3-Clause licensed by C. McCann, Oleg Grenrus
Maintained by Oleg Grenrus

Module documentation for

This version can be pinned in stack with:semialign-,2444

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.


  • Drop base-compat dependency


  • 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?


Split out of these package.