HASKELL - Что использовать для помеченного набора?
Вопрос
Вопрос для начинающих - что вы обычно используете в качестве мультимапа? Я хочу функцию, которая принимает функцию маркировки и элементы раздела по каждой метке. Например,
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
S. group
функционировать sort
, и какое -то картирование, но должен быть более простой способ, нет? Это кажется в целом полезной функции.
Решение
Когда есть только два случая, вы можете сопоставить их с логинами и использовать 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])]