Если я правильно понимаю ваш вопрос, вы хотите вернуть все элементы, которые не соответствуют предикату (< 7)
в качестве первого элемента пары.
В этом случае вы можете просто использовать функцию not
, чтобы перевернуть полученное логическое значение.
То есть создайте новый предикат (\x -> not (oldPred x))
, или используя состав функции: (not . oldPred)
:
countFilter :: (a -> Bool) -> [a] -> ([a], Int)
countFilter f xs = (filter (not . f) xs, length (filter f xs))
Обратите внимание, что и filter
, и length
могут работать с пустыми списками, поэтому вам не нужно писать case
самостоятельно.
В качестве альтернативы, вы можете использовать функцию partition для создания двух списков, чтобы вы не фильтровали список дважды:
import Data.List
countFilter :: (a -> Bool) -> [a] -> ([a], Int)
countFilter f xs = let (ys, zs) = partition (not . f) xs
in (ys, length zs)
Возможно, возможно создать еще более эффективную версию, которая не использует length
, но я оставляю это как упражнение: -)