
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 @@ -53,8 +53,12 @@ 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 @@ -25,8 +25,8 @@ 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, @@ -524,6 +524,22 @@ 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' @@ -556,6 +572,20 @@ 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., @x \`elem\` xs@. For the result to be -- 'False', the list must be finite; 'True', however, results from an element equal to @x@ 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 @@ -125,4 +125,7 @@ * 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