Стандартное имя для (фильтр p xs, filter (not.p) xs)

Есть ли какая-то функция в haskell, которая оценивает (фильтровать 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])

Hoogle - ваш друг:

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])