multi-except: Multiple Exceptions

[ exceptions, library, mit ] [ Propose Tags ]

Succeed, or return one or more errors.

[Skip to Readme]


[Index] [Quick Jump]


Maintainer's Corner

Package maintainers

For package maintainers and hackage trustees


Versions [RSS],,,,,,,, 1.0.0, 2.0.0
Change log
Dependencies base (>=4.0 && <5), multi-except, semigroupoids (>=1 && <7) [details]
License MIT
Author Owen Shepherd
Category Exceptions
Home page
Source repo head: git clone
Uploaded by 414owen at 2024-01-03T15:04:34Z
Distributions NixOS:2.0.0
Downloads 1000 total (10 in the last 30 days)
Rating 2.0 (votes: 1) [estimated by Bayesian average]
Your Rating
  • λ
  • λ
  • λ
Status Docs uploaded by user
Build status unknown [no reports yet]

Readme for multi-except-2.0.0

[back to package description]


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


{-# 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.