Есть ли какая-то функция в haskell, которая оценивает (фильтровать p xs, filter (not.p) xs) в одном обходном списке (здесь два) или существует ли какое-то общее имя в функциональном программировании для такого рода функций?
Стандартное имя для (фильтр p xs, filter (not.p) xs)
Ответ 1
Сначала посмотрите на нужный тип:
Prelude> :t \p xs -> (filter p xs, filter (not . p) xs)
\p xs -> (filter p xs, filter (not . p) xs)
:: (a -> Bool) -> [a] -> ([a], [a])
Prelude> :hoogle (a -> Bool) -> [a] -> ([a], [a])
Prelude break :: (a -> Bool) -> [a] -> ([a], [a])
Prelude span :: (a -> Bool) -> [a] -> ([a], [a])
Data.List break :: (a -> Bool) -> [a] -> ([a], [a])
Data.List partition :: (a -> Bool) -> [a] -> ([a], [a])
Data.List span :: (a -> Bool) -> [a] -> ([a], [a])
Теперь попробуйте выполнить функции:
Prelude> break odd [1..10]
([],[1,2,3,4,5,6,7,8,9,10])
Prelude> span odd [1..10]
([1],[2,3,4,5,6,7,8,9,10])
Prelude> import Data.List
Prelude Data.List> partition odd [1..10]
([1,3,5,7,9],[2,4,6,8,10])
Ответ 2
Haskell называет его partition
.
Ответ 3
Я думаю, вам нужно Data.List.partition, например.
partition (>2) [1,2,3,4,5]
приводит к ([3,4,5], [1,2])