HORIZON HASKELLDocslts/ghc-9.10.x248f8f02026-10-05Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · 248f8f0 · 2026-10-05

Modulesemialign-1.3.1Haskell2010

Data.Zip

Zipping and unzipping of functors with non-uniform shapes.

  • 1 type
  • 4 classes
  • 1 value
  • Packagesemialign-1.3.1
  • Exports6
  • LanguageHaskell2010
  • LicenceBSD-3-Clause
  • SourceZip.hs
classclass Functor f => Semialign (f :: Type -> Type) where
#

Functors supporting an align operation that takes the union of non-uniform shapes.

Minimal definition: either align or alignWith.

Laws

The laws of align and zip resemble lattice laws. There is a plenty of laws, but they are simply satisfied.

And an additional property if f is Foldable, which tries to enforce align-feel: neither values are duplicated nor lost.

Note: join f x = f x x

Idempotency

join align ≡ fmap (join These)

Commutativity

align x y ≡ swap <$> align y x

Associativity

align x (align y z) ≡ assoc <$> align (align x y) z

With

alignWith f a b ≡ f <$> align a b

Functoriality

align (f <$> x) (g <$> y) ≡ bimap f g <$> align x y

Alignedness, if f is Foldable

toList x ≡ toListOf (folded . here) (align x y)
         ≡ mapMaybe justHere (toList (align x y))

Methods

  • align :: f a -> f b -> f (These a b)

    Analogous to zip, combines two structures by taking the union of their shapes and using These to hold the elements.

  • alignWith :: (These a b -> c) -> f a -> f b -> f c

    Analogous to zipWith, combines two structures by taking the union of their shapes and combining the elements with the given function.

Instances18Semialign, …
classclass Semialign f => Zip (f :: Type -> Type) where
#

Functors supporting a zip operation that takes the intersection of non-uniform shapes.

Minimal definition: either zip or zipWith.

Idempotency

join zip   ≡ fmap (join (,))

Commutativity

zip x y ≡ swap <$> zip y x

Associativity

zip x (zip y z) ≡ assoc <$> zip (zip x y) z

Absorption

fst    <$> zip xs (align xs ys) ≡ xs
toThis <$> align xs (zip xs ys) ≡ This <$> xs
  where
    toThis (This a)    = This a
    toThis (These a _) = This a
    toThis (That b)    = That b

With

zipWith f a b ≡ f <$> zip a b

Functoriality

zip (f <$> x) (g <$> y) ≡ bimap f g <$> zip x y

Zippyness

fmap fst (zip x x) ≡ x
fmap snd (zip x x) ≡ x
zip (fmap fst x) (fmap snd x) ≡ x

Distributivity

                   align (zip xs ys) zs ≡ undistrThesePair <$> zip (align xs zs) (align ys zs)
distrPairThese <$> zip (align xs ys) zs ≡                      align (zip xs zs) (zip ys zs)
                   zip (align xs ys) zs ≡ undistrPairThese <$> align (zip xs zs) (zip ys zs)

Note, the following doesn't hold:

distrThesePair <$> align (zip xs ys) zs ≢ zip (align xs zs) (align ys zs)

when xs = [] and ys = zs = [0], then the left hand side is "only" [(That 0, That 0)], but the right hand side is [(That 0, These 0 0)].

Methods

  • zip :: f a -> f b -> f (a, b)

    Combines two structures by taking the intersection of their shapes and using pair to hold the elements.

  • zipWith :: (a -> b -> c) -> f a -> f b -> f c

    Combines two structures by taking the intersection of their shapes and combining the elements with the given function.

Instances18Zip, …
  • Zip IntMapDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Zip SeqDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Zip TreeDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Zip NonEmptyDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Zip IdentityDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Zip ZipListDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Zip MaybeDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Zip VectorDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Zip []Defined in semialign-1.3.1 · Data.Semialign.Internal
  • Monad m => Zip (Stream m)Defined in semialign-1.3.1 · Data.Semialign.Internal
  • Ord k => Zip (Map k)Defined in semialign-1.3.1 · Data.Semialign.Internal
  • Zip ProxyDefined in semialign-1.3.1 · Data.Semialign.Internal
  • (Eq k, Hashable k) => Zip (HashMap k)Defined in semialign-1.3.1 · Data.Semialign.Internal
  • Monad m => Zip (Bundle m v)Defined in semialign-1.3.1 · Data.Semialign.Internal
  • Zip (Tagged b)Defined in semialign-1.3.1 · Data.Semialign.Internal
  • Zip ((->) e)Defined in semialign-1.3.1 · Data.Semialign.Internal
  • (Zip f, Zip g) => Zip (Product f g)Defined in semialign-1.3.1 · Data.Semialign.Internal
  • (Zip f, Zip g) => Zip (Compose f g)Defined in semialign-1.3.1 · Data.Semialign.Internal
classclass Zip f => Repeat (f :: Type -> Type) where
#

Zippable functors supporting left and right units

Unit

fst <$> zip xs (repeat y) ≡ xs
snd <$> zip (repeat x) ys ≡ ys

Methods

  • repeat :: a -> f a

    A repeat structure.

Instances11Repeat, …
  • Repeat TreeDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Repeat NonEmptyDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Repeat IdentityDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Repeat ZipListDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Repeat MaybeDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Repeat []Defined in semialign-1.3.1 · Data.Semialign.Internal
  • Repeat ProxyDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Repeat (Tagged b)Defined in semialign-1.3.1 · Data.Semialign.Internal
  • Repeat ((->) e)Defined in semialign-1.3.1 · Data.Semialign.Internal
  • (Repeat f, Repeat g) => Repeat (Product f g)Defined in semialign-1.3.1 · Data.Semialign.Internal
  • (Repeat f, Repeat g) => Repeat (Compose f g)Defined in semialign-1.3.1 · Data.Semialign.Internal
classclass Zip f => Unzip (f :: Type -> Type) where
#

Right inverse of zip.

This class is definable for every Functor. See unzipDefault.

Laws

uncurry zip (unzip xs) ≡ xs
unzip (zip xs xs) ≡ (xs, xs)

Note:

unzip (zip xs ys) ≢ (xs, _) or (_, ys)

For sequence-like types this holds, but for Map-like it doesn't.

Methods

  • unzipWith :: (c -> (a, b)) -> f c -> (f a, f b)
  • unzip :: f (a, b) -> (f a, f b)
Instances15Unzip, …
  • Unzip IntMapDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Unzip SeqDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Unzip TreeDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Unzip NonEmptyDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Unzip IdentityDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Unzip ZipListDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Unzip MaybeDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Unzip VectorDefined in semialign-1.3.1 · Data.Semialign.Internal
  • Unzip []Defined in semialign-1.3.1 · Data.Semialign.Internal
  • Ord k => Unzip (Map k)Defined in semialign-1.3.1 · Data.Semialign.Internal
  • Unzip ProxyDefined in semialign-1.3.1 · Data.Semialign.Internal
  • (Eq k, Hashable k) => Unzip (HashMap k)Defined in semialign-1.3.1 · Data.Semialign.Internal
  • Unzip (Tagged b)Defined in semialign-1.3.1 · Data.Semialign.Internal
  • (Unzip f, Unzip g) => Unzip (Product f g)Defined in semialign-1.3.1 · Data.Semialign.Internal
  • (Unzip f, Unzip g) => Unzip (Compose f g)Defined in semialign-1.3.1 · Data.Semialign.Internal
newtypenewtype Zippy (f :: Type -> Type) a
#

Constructors

Instances9Functor, Applicative, Apply, Eq, Ord, Read, …