Align and Zip type-classes from the common Semialign ancestor.

Version on this page:1.1
LTS Haskell 22.30:1.3.1
Stackage Nightly 2024-07-24:1.3.1
Latest on Hackage:1.3.1

See all snapshots semialign appears in

BSD-3-Clause licensed by C. McCann, Oleg Grenrus
Maintained by Oleg Grenrus
This version can be pinned in stack with:semialign-1.1@sha256:5ff1788b6bcec97084ca60f736c126334e4ba4a450517e7ca4f69dd1156d38a0,2471

Module documentation for 1.1

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.



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