Haskell - что использовать для маркированного набора разделов? - PullRequest
4 голосов
/ 25 июля 2011

Вопрос новичка - что вы обычно используете в качестве мультикарты?Я хочу функцию, которая принимает функцию маркировки и разделение элементов каждой меткой.Например,

f x | x `mod` 2 == 0 = EVEN
    | otherwise = ODD

вывод partition f lst, где lst :: [Int] будет

EVEN --> [list of even numbers]
ODD --> [sublist of odd numbers]

Извините за беспокойство, я не смог найти что-то похожее в Google.Я думаю, что смогу добраться туда с помощью функции Data.List.Key group, sort и некоторого отображения, но должен быть более простой способ, нет?Это похоже на полезную функцию.

1 Ответ

7 голосов
/ 25 июля 2011

Когда есть только два случая, вы можете сопоставить их с логическими значениями и использовать Data.List.partition.

Prelude Data.List> partition odd [1, 23, 42, 7, 1337, 8]
([1,23,7,1337],[42,8])

В общем случае вы можете использовать Data.Map со списком или в качестве типа значения.Вы можете легко создать его, используя Data.Map.fromListWith.

Prelude Data.Map> let partition f xs = fromListWith (++) [(f x, [x]) | x <- xs]
Prelude Data.Map> partition (`mod` 3) [1, 23, 42, 7, 1337, 8]
fromList [(0,[42]),(1,[7,1]),(2,[8,1337,23])]
...