Стандартное имя для (фильтр p xs, фильтр (not.p) xs) - PullRequest
10 голосов
/ 22 марта 2012

Есть ли в haskell какая-то функция, которая оценивает (filter p xs, filter (not.p) xs) в одном обходе списка (здесь их два) или в функциональном программировании есть какое-то общее имя для такого рода функции?

Ответы [ 3 ]

33 голосов
/ 22 марта 2012

Сначала посмотрите на нужный вам тип:

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])
3 голосов
/ 22 марта 2012

Хаскель называет это partition.

0 голосов
/ 22 марта 2012

Я думаю, вы хотите Data.List.partition, например,

partition (>2) [1,2,3,4,5]

приводит к ([3,4,5], [1,2])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...