The semi-iso package

[Tags:library, mit]

Semi-isomorphisms are partial isomorphisms with weakened iso laws. They are a basic building block of reversible computations. And they work with Iso and Prism from lens!

The module Control.Lens.SemiIso defines semi-isomorphisms and provides some basic semi-isos and combinators. A SemiIso' a b can be applied in both directions to get a a -> Either String b and b -> Either String a. SemiIsos can be composed with Isos and Prisms (to get another SemiIso). Isos and Prisms can be directly used as SemiIsos.

Semi-isomorphisms obey weaker laws then isomorphisms. We require only

 apply f >=> unapply f >=> apply f = apply f
 unapply f >=> apply f >=> unapply f = unapply f

instead of

 apply f >=> unapply f = f
 unapply f >=> apply f = f

Modules Control.SIArrow and Control.Category.Structures define an Arrow-like class hierarchy. Unfortunately Control.Arrow cannot be used, as it is too restrictive (the dreaded arr). SIArrow abstracts categories of reversible computations (with reversible side effects). In the case of parsing and pretty-printing using the syntax library if we have an arrow SIArrow cat => cat a b then we can:

In the particular case of parsing/pretty-printing the type a will be usually (), e.g. we just produce a value during parsing and just consume a value during pretty-printing. To support this style we define a functor and applicative structure on cat () b, for example /*/ (equivalent of <*>) has type (/*/) :: SIArrow cat => cat () a -> cat () b -> cat () (a, b).

When more power then applicative is needed - for example when the syntax depends on the parsed value - we turn back to arrow composition.

Module Control.Category.Reader defines a Reader category transformer. It is like a monad transformer, but for categories. The next version will include some more transformers and mtl-style classes.


Dependencies base (==4.*), lens, profunctors, semigroupoids, transformers, tuple-morph [details]
License MIT
Copyright Paweł Nowak 2014
Author Paweł Nowak
Maintainer Paweł Nowak <>
Category Control, Data
Source repository head: git clone
Uploaded Fri Dec 12 23:30:20 UTC 2014 by pawel834
Distributions NixOS:
Downloads 1065 total (4 in the last 30 days)
0 []
Status Docs uploaded by user [build log]
All reported builds failed as of 2014-12-12 [all 1 reports]




Maintainer's Corner

For package maintainers and hackage trustees