IsNull-0.3.0.0: src/Data/IsNull.hs
{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE IncoherentInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{- |
Module: IsNull
Description: A typeclass to determine if a given value is null.
Copyright: João Cristóvão, 2014
License: BSD3
Maintainer: jmacristovao@gmail.com
A typeclass to determine if a given value is null.
Strongly inspired by
<https://hackage.haskell.org/package/mono-traversable mono-traversable>
but with a simpler goal: supporting IsNull and nested IsNull operations.
While the @'isNull'@ function is equivalent to @(==) mempty@ for most of
the instances, not all @'Foldable'@s are monoids,
and not all monoids @'mempty'@ means null:
* @'Either'@ is an example of a @Foldable@ which is not a
@'Monoid'@, but where it makes sense to consider a @'Left'@ as
an 'Null' value. While this is not strictly true, the @'Left'@
option does carries a value, we take the more liberal approach:
Empty ~ Null ~ Invalid Value.
If you need proper type reasoning, you should not be using this
package, just regular pattern matching instead.
* @'Product'@ @'Monoid'@ instance is @1@. Hardly qualifies as an
@Empty@ or @Null@ value. For this reason no default implementation
is provided for the @'Monoid'@ class. It's up to you to use
@(==) mempty@ instead.
The main use case for this package are boolean conditions,
namely the @if@ @then@ @else@ construct.
Bugs, suggestions and comments are most welcomed!
<https://github.com/jcristovao/IsNull>
-}
module Data.IsNull (
IsNull(..)
) where
import Data.IsNull.Internal