2016-11-10 4 views
0

私は要素を等価でグループ化する標準ライブラリ関数を探しています。グループ要素を等価で

例:groupsortを構成

f [1,2,3,1,2,3] == [ [1,1], [2,2], [3,3] ]

が仕事をしていません:

Prelude Data.List> group . sort $ [1,2,3,1,2,3] 
[[1,1],[2,2],[3,3]] 

しかし、単一の関数で上記の作業を行うことができるHaskellのライブラリにあるネイティブ関数があります?

私はData.Listを見ましたが、このような機能は見つかりませんでした。

+6

わかりません。多くのことのためのライブラリ関数はありません。特にこれが単純な場合はそうです。ただし、この実装は、ユースケースによっては必ずしも効率的ではありません。例えば、 'Map Item Int'を使って各項目の数を増やしたほうが良いかもしれません。そして、' group 'の出力を再作成することができます。代わりにそのマップからソートします。 – bheklilr

+4

GHCiでの私の予備テスト(常に最適化されたパフォーマンスを示す最良の指標ではありませんが、今のところそれがあります)では、最後にグループ。 $ xs = '1000000 $ cycle [1..20]'をとり、通常の形式に強制された '$ xs'は2.39秒で、合計で1.483GBのRAMを使用します。' let counter = Map.fromListWith(+ 。フリップジップ(リピート1)。 uncounter = map(uncurry $ flip replicate)です。 Map.toAscList': 'last。最後に未知数。カウンタ$ xsは0.34秒で、合計RAMは369 MBです。そのRAMの多くは 'xs'自身からのものです。 – bheklilr

+1

'HashMap'を使うと、' Data.Map'の 'Map'だけでなく、もっと良いかもしれません。 – Shersh

答えて

3

baseにこのような機能はありません。しかし、discriminationパッケージがあります。 Data.Discriminationでは、次の機能があります:

group :: Grouping a => [a] -> [[a]] 

あなたはGenericのインスタンスを持っているタイプのための場所でのデフォルトメソッドがあるとして、これらのGroupingのインスタンスを自分で記述する必要はありません。たとえば、

{-# LANGUAGE DeriveGeneriC#-} 
import Data.Discrimination 

data A = A deriving Generic 
instance Grouping A 
instance Sorting A -- Not necessary for what you are trying to do. 
関連する問題