BSD-3-Clause licensed by C. McCann, Oleg Grenrus
Maintained by Oleg Grenrus
This version can be pinned in stack with:semialign-1.3@sha256:7be9ef5ca1d6b052991f68c053aab68b9d1ab3b1938c9557ac84c97937815223,2888

Module documentation for 1.3

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.



  • Depend on bifunctor-classes-compat instead of bifunctors See changelog note in bifunctors-5.6: 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.

  • GHC-9.2 support


  • Migrate SemialignWithIndex and ZipWithIndex to this package, using FunctorWithIndex from indexed-traversable.
  • Add RepeatWithIndex type-class.
  • Poly-kinded instances (notably Tagged)

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