2011-07-25 5 views
4

初心者の質問 - 通常はマルチマップとして何を使用しますか?私は、ラベル付け機能を持ち、各ラベルごとに要素を分割する関数が必要です。例えば、Haskell - ラベル付きセットパーティションには何を使用しますか?

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

lst :: [Int]がわざわざため

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

申し訳ありませんでしょうpartition f lstの出力は、私がHoogleに似た何かを見つけることができませんでした。私はData.List.Keygroupファンクション、sort、およびいくつかのマッピングを介してそこに着くことができると思いますが、より簡単な方法が必要ですか?これは一般的に有用な機能のようです。

答えて

7

ケースが2つしかない場合は、ブール値にマップし、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])] 
関連する問題