Haskell’s boolean type is regarded differently from other data types such as
Either. Both those types have a ‘fold’ function defined for them (
either, respectively), but
Bool doesn’t have such a function. All
Bool is stuck with is the build-in
if then else-syntax, or worse: pattern matching.
With a ‘fold’ function (also known as a reducer, eliminator or catamorphism) you can reduce a value of one data type to a value of another data type. This is a very popular way to reduce values, e.g. lists have the very popular
foldr. This package provides that same function for the
Bool data type; a function called
bool function is a replacement for the build-in
if then else-syntax. However, since it is a function instead of syntax, it can be partially applied and passed around to higher order functions, like so:
ghci> :m + Data.Bool.Extras
ghci> let yesOrNo = bool "no" "yes"
ghci> map yesOrNo [True, False, True]
["yes", "no", "yes"]
Note that the arguments to
bool are in the opposite order of the
if then else-syntax; First the false value, then the true value, and finally the boolean. This argument order is consistent with the data type declaration and functions like
The package contains some other functions that are mostly just partial applications of the
There is the
mwhen for Monoids,
whenA for Arrows, and
whenM for Monads. These are useful when you either want to do something, or not and take the default route. Here’s an example of
mwhen for Monoids:
-- Important numbers!
xs = [6, 9, 13, 42]
-- Without library
f :: Bool -> [Int]
f b = if b then xs else 
-- With library
g :: Bool -> [Int]
g = mwhen xs
See? It’s an amazing 14 characters shorter!
The current version of bool-extras is 0.3.0 and is available on Hackage.
If you have cabal-install (which you really should have, by the way), the package can be installed like so:
cabal install bool-extras
If you don’t have cabal-install, you can manually download and install bool-extras:
tar xzf bool-extras-0.3.0.tgz
./Setup.lhs configure --user
About the package
The source code for this packages lives in a public git repository on github.
The co-authors for this library are: Erik Hesselink, Jeroen Leeuwestein, and Sebastiaan Visser
(by “co-authors”, I of course mean: people who couldn’t stop laughing when I wrote the library).
- Added the
mwhenM function, requested by Sebastiaan Visser.
- Added upper bound for
- Cleaned up documentation and code.