2011-07-25 37 views
4

初學者問題 - 你通常用什麼作爲多圖?我想要一個帶有標籤功能和每個標籤分割元素的函數。例如,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] 

對不起打擾,我無法找到Hoogle類似的東西。我想我可以通過Data.List.Keygroup函數,sort和一些映射到達那裏,但是必須有一個更簡單的方法,不是嗎?這似乎是一個通常有用的功能。

回答

7

當只有兩種情況時,可以將它們映射到布爾值並使用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])]