Haskell - 用于标记集分区的内容是什么?

gat*_*ado 4 haskell multimap

初学者问题 - 您通常将什么用作多图?我想要一个带标签功能的函数,并按每个标签分区元素.例如,

f x | x `mod` 2 == 0 = EVEN
    | otherwise = ODD
Run Code Online (Sandbox Code Playgroud)

的输出partition f lst,其中lst :: [Int]

EVEN --> [list of even numbers]
ODD --> [sublist of odd numbers]
Run Code Online (Sandbox Code Playgroud)

对不起,我在Hoogle上找不到类似的东西.我想我可以通过那里Data.List.Keygroup功能,sort和一些映射,但必须有一个更简单的方法,不是吗?这似乎是一个普遍有用的功能.

ham*_*mar 7

当只有两种情况时,您可以将它们映射到布尔值并使用Data.List.partition.

Prelude Data.List> partition odd [1, 23, 42, 7, 1337, 8]
([1,23,7,1337],[42,8])
Run Code Online (Sandbox Code Playgroud)

在一般情况下,您可以使用Data.Map带有列表的a或设置为值类型.你可以轻松地构建一个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])]
Run Code Online (Sandbox Code Playgroud)