HASKELL - Что использовать для помеченного набора?

StackOverflow https://stackoverflow.com/questions/6810773

  •  25-10-2019
  •  | 
  •  

Вопрос

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

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.KeyS. 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])]
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top