### [PATCH 1/3] Implement nand, nor, nany and nall in Data.List

Alexander Berntsen <alexander <at> plaimi.net>

2014-02-27 15:13:00 GMT

Implement negation-shorthands for `and`, `or`, `any` and `all` in
Data.List: `nand`, `nor`, `nany`, `nall`. These functions compose `not`
with `and`, `or`, `any` and `all` respectively.
The rationale is less typing, and a more readable and immediately
obvious way of doing this.
The added namespace pollution should not be dramatic. If someone has
defined the negations of `and` etc. elsewhere, they have likely defined
`and` etc. as well.
---
Data/List.hs | 4 ++++
GHC/List.lhs | 34 ++++++++++++++++++++++++++++++++--
changelog.md | 3 +++
3 files changed, 39 insertions(+), 2 deletions(-)
diff --git a/Data/List.hs b/Data/List.hs
index 09aed9d..6675dfc 100644
--- a/Data/List.hs
+++ b/Data/List.hs
<at> <at> -53,8 +53,12 <at> <at> module Data.List
, concatMap
, and
, or
+ , nand
+ , nor
, any
, all
+ , nany
+ , nall
, sum
, product
, maximum
diff --git a/GHC/List.lhs b/GHC/List.lhs
index e004ded..a8b8950 100644
--- a/GHC/List.lhs
+++ b/GHC/List.lhs
<at> <at> -25,8 +25,8 <at> <at> module GHC.List (
foldl, scanl, scanl1, foldr, foldr1, scanr, scanr1,
iterate, repeat, replicate, cycle,
take, drop, splitAt, takeWhile, dropWhile, span, break,
- reverse, and, or,
- any, all, elem, notElem, lookup,
+ reverse, and, or, nand, nor,
+ any, all, nany, nall, elem, notElem, lookup,
concatMap,
zip, zip3, zipWith, zipWith3, unzip, unzip3,
errorEmptyList,
<at> <at> -524,6 +524,22 <at> <at> or (x:xs) = x || or xs
#-}
#endif
+-- | 'nand' returns the negated conjunction of a Boolean list. For the result
+-- to be 'False', the list must be finite; 'True', however, results from a
+-- 'False' value at a finite index of a finite or infinite list.
+--
+-- /Since: 4.7.0.0/
+nand :: [Bool] -> Bool
+nand = not . and
+
+-- | 'nor' returns the negated disjunction of a Boolean list. For the result
+-- to be 'True', the list must be finite; 'False', however, results from a
+-- 'True' value at a finite index of a finite or infinite list.
+--
+-- /Since: 4.7.0.0/
+nor :: [Bool] -> Bool
+nor = not . or
+
-- | Applied to a predicate and a list, 'any' determines if any element
-- of the list satisfies the predicate. For the result to be
-- 'False', the list must be finite; 'True', however, results from a 'True'
<at> <at> -556,6 +572,20 <at> <at> all p (x:xs) = p x && all p xs
#-}
#endif
+-- | Applied to a predicate and a list, 'nany' determines if no element
+-- of the list satisfies the predicate. For the result to be
+-- 'True', the list must be finite; 'False', however, results from a 'True'
+-- value for the predicate applied to an element at a finite index of a finite or infinite list.
+nany :: (a -> Bool) -> [a] -> Bool
+nany p = not . any p
+
+-- | Applied to a predicate and a list, 'nall' determines if not all elements
+-- of the list satisfy the predicate. For the result to be
+-- 'False', the list must be finite; 'True', however, results from a 'False'
+-- value for the predicate applied to an element at a finite index of a finite or infinite list.
+nall :: (a -> Bool) -> [a] -> Bool
+nall p = not . all p
+
-- | 'elem' is the list membership predicate, usually written in infix form,
-- e.g., <at> x \`elem\` xs <at> . For the result to be
-- 'False', the list must be finite; 'True', however, results from an element equal to <at> x <at> found at a finite
index of a finite or infinite list.
diff --git a/changelog.md b/changelog.md
index 88ceec5..20c90f7 100644
--- a/changelog.md
+++ b/changelog.md
<at> <at> -125,4 +125,7 <at> <at>
* Remove deprecated function `unsafePerformIO` export from `Foreign`
(still available via `System.IO.Unsafe.unsafePerformIO`).
+ * Implement negation-shortands for `and`, `or`, `any` and `all` in
+ `Data.List`: `nand`, `nor`, `nany`, and `nall`.
+
* Various fixes and other improvements (see Git history for full details).
--
--
1.8.3.2