HORIZON HASKELLDocslts/ghc-9.10.xc74966e2026-09-27Search names, modules, packages, or :: a typeCtrl K

GHC 9.10.3 · lts/ghc-9.10.x · c74966e · 2026-09-27

Modulesemigroupoids-6.0.1Haskell2010

Data.Functor.Alt

  • 1 class
  • 2 values
classclass Functor f => Alt (f :: Type -> Type) where
#

Laws:

<!> is associative:             (a <!> b) <!> c = a <!> (b <!> c)
<$> left-distributes over <!>:  f <$> (a <!> b) = (f <$> a) <!> (f <$> b)

If extended to an Alternative then <!> should equal <|>.

Ideally, an instance of Alt also satisfies the "left distribution" law of MonadPlus with respect to <.>:

<.> right-distributes over <!>: (a <!> b) <.> c = (a <.> c) <!> (b <.> c)

IO, Either a, ExceptT e m and GHC.Conc.STM instead satisfy the "left catch" law:

pure a <!> b = pure a

Maybe and Identity satisfy both "left distribution" and "left catch".

These variations cannot be stated purely in terms of the dependencies of Alt.

When and if MonadPlus is successfully refactored, this class should also be refactored to remove these instances.

The right distributive law should extend in the cases where the a Bind or Monad is provided to yield variations of the right distributive law:

(m <!> n) >>- f = (m >>- f) <!> (m >>- f)
(m <!> n) >>= f = (m >>= f) <!> (m >>= f)

Methods

Instances43Alt, …
  • Alt FirstDefined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt LastDefined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt IntMapDefined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt SeqDefined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt NonEmptyDefined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt IdentityDefined in semigroupoids-6.0.1 · Data.Functor.Alt

    Choose the first option every time. While 'choose the last option' every time is also valid, this instance satisfies more laws.

  • Alt FirstDefined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt LastDefined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt MaybeDefined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt IODefined in semigroupoids-6.0.1 · Data.Functor.Alt

    This instance does not actually satisfy the (<.>) right distributive law It instead satisfies the "left catch" law

  • Alt []Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alternative f => Alt (WrappedApplicative f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • MonadPlus m => Alt (WrappedMonad m)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Ord k => Alt (Map k)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt ProxyDefined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt U1Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt V1Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt (Either a)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt f => Alt (Lift f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • (Functor f, Monad f) => Alt (MaybeT f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • (Hashable k, Eq k) => Alt (HashMap k)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • ArrowPlus a => Alt (WrappedArrow a b)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt f => Alt (Rec1 f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt f => Alt (Static f a)Defined in semigroupoids-6.0.1 · Data.Semigroupoid.Static
  • Alt f => Alt (Backwards f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt f => Alt (IdentityT f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt f => Alt (ReaderT e f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt f => Alt (StateT e f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt f => Alt (StateT e f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt f => Alt (WriterT w f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt f => Alt (WriterT w f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt f => Alt (WriterT w f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt f => Alt (Reverse f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • (Functor f, Monad f, Semigroup e) => Alt (ExceptT e f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Semigroup c => Alt (K1 i c)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
    since 5.3.8
  • (Alt f, Alt g) => Alt (Product f g)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • (Alt f, Alt g) => Alt (f :*: g)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt f => Alt (M1 i c f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt f => Alt (RWST r w s f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt f => Alt (RWST r w s f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • Alt f => Alt (RWST r w s f)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • (Alt f, Functor g) => Alt (Compose f g)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
  • (Alt f, Functor g) => Alt (f :.: g)Defined in semigroupoids-6.0.1 · Data.Functor.Alt
valuegalt :: (Generic1 f, Alt (Rep1 f)) => f a -> f a -> f a
#

Generic (<!>). Caveats:

  1. Will not compile if f is a sum type.

  2. Any types where the a does not appear must have a Semigroup instance.