A typeclass to determine if a given value is null.
A typeclass to determine if a given foldable type (or other) is empty ~ null ~ invalid. The definition is intentionally vague, to cover types from Either to Text and Sets.
IsNull
A typeclass to determine if a given container is null.
Strongly inspired by mono-traversable, but with a simpler goal: supporting IsNull and nested IsNull operations.
Supported functions:
isNull :: a -> Bool
notNull :: a -> Bool
-- | Nested isNull
isNullN :: (Foldable f) => f a -> Bool
-- | Monadic isNull
isNullM :: Monad m => m a -> m Bool
-- | Monadic Nested isNull
isNullNM :: (Monad m, Foldable f) => m (f a) -> m Bool
-- | Alternative <|> operator does not always operate as choice,
-- at least not in an intuitive way (for example with lists).
-- This one does:
<\> :: a -> a -> a
The N stands for (non-recursive) nested, such that:
isNullN (Just "abc") == False
isNullN (Just "" ) == True
isNullN (Nothing ) == True
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 aFoldable
which is not aMonoid
, but where it makes sense to consider aLeft
as an 'Null' value. While this is not strictly true, theLeft
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 is1
. Hardly qualifies as anEmpty
orNull
value. For this reason no default implementation is provided for theMonoid
class. It's up to you to use(==) mempty
instead.
Bugs, suggestions and comments are most welcomed!