2

リスト内の各個別の値がそのリストで何回出現するかをカウントする関数 (頻度) があります。例えば、

frequency "ababca" 

返す必要があります:

[(3, 'a'), (2, 'b'), (1, 'c')].

これは正常に機能しますが、この関数を使用して、リストのリスト内の最初の要素を使用してリストを並べ替える必要があります。

results   :: [Party ] -> [(Int, Party)]
results  xs = ??? frequency (sort xs) ??? 

希望する出力の例:

[(1, "Green"), (2, "Red"), (3, "Blue")]

上記は機能しません。何ができるかわかりません。

通常の「ソート」を使用する

前もって感謝します。

4

2 に答える 2

8
import Data.Function (on)
import Data.List (sortBy)

results xs = sortBy (compare `on` fst) (frequency xs)

-- or, if you prefer
results xs = sort (frequency xs)

、、、、のドキュメントへonsortByリンク。comparefst

違いはsort、各ペアの最初の要素の昇順で並べ替え、ペアの 2 番目の要素でタイブレークを破る一方で、sortBy (compare `on` fst)明示的には各ペアの最初の要素のみを調べることです。

于 2012-04-07T16:07:03.173 に答える
2

しか使用できsortsortBy(何らかの理由で!) 使用できない場合は、アイテムが のインスタンスであるタイプであることを確認する必要がありますOrdたまたま、タプル内のすべての位置にもインスタンスがある場合、すべてのタプル (サイズ 15 まで) にOrdインスタンスがあります。Ord

と の両方にインスタンスがあるため、指定した例は(1, "Green"), (2, "Red"), (3, "Blue")]うまくソートされるはずです (逆になっていますが) 。IntStringOrd

ただし、コード スニペットでは、Party実際にそれが何であるかを述べずに型について言及しています。String のような単なるエイリアスではない場合はOrd、タプルの組み込み Ord インスタンスを満たすために、そのインスタンスを定義する必要がある場合があります。

derivingタイプを宣言するときに使用して、Haskellにインスタンスを作成させることができます

 data Party = P1 | P2 | P3 | P4 -- e.g.
     deriving (Eq,Ord)

または自分で宣言します:

 instance Ord Party where
     -- you don't care about the ordering of the party values
     compare a b = EQ   

しかし、dave4420 が言うように、単に を使用する方がはるかに優れているため、使用sortByしない特別な理由がない限り (つまり、制限付きのクラス割り当てである場合)、それを使用します。

于 2012-04-07T16:52:57.797 に答える