Succeed, or return one or more errors.


Keywords
library, mit, Propose Tags, Skip to Readme, Index, Quick Jump, Control.Applicative.MultiExcept, multi-except-2.0.0.tar.gz, browse, Package description, Package maintainers, 414owen, edit package information , 0.1.0.0, 0.1.2.0, 0.1.4.0, 0.2.0.0, 0.2.1.0, 0.3.0.0, Data.Functor.Compose, applicative, haskell
License
MIT
Install
cabal install multi-except-2.0.0

Documentation

multi-except

Hackage version CI Status GitHub License

multi-except - succeed, or return one or more errors

Adding the dependency

-- in your cabal file
  -- Add the main package (only depends on base!)
  , multi-except
  -- For the Alt instance (depends on semigroupoids)
  , multi-except:semigroupoid-instances

Usage

{-# LANGUAGE ApplicativeDo #-}

import Control.Applicative.MultiExcept

errors :: MultiExcept String (Int, Int, Int)
errors = do
  a <- throwError "no monad instance"
  b <- pure 12
  c <- throwError "i am scared"
  pure (a, b, c)

-- errors: Errors ["no monad instance", "i am scared"]

The use of ApplicativeDo is significant and necessary for using MultiExcept with do notation.

MultiExcept is not a Monad, only an Applicative, so a few constraints apply, such as not being able to determine the structure of the rest of the computation based on a previously do-bound value. If the previous sentence was confusing, then you might want to consider using a writer monad instead.

To compose with other applicative effects, you can use Data.Functor.Compose.