3

簡単な質問で申し訳ありませんが、私はhaskellに非常に慣れていません..

別の関数「頻度」によって生成されたタプルのリストをソートする関数「順序」を作成しようとしています(頻度はリスト内の個別の要素の数をカウントし、そのような結果の1つを返します、たとえば>頻度「aabbbccc」、結果 [(2,a),(3,b),(3,c)]) を昇順にします。書き方が思いつきません。

>sort (頻度スコア) をプレリュードに書き込むと、それがソートされます (スコアはグレードのリスト、つまり ["a"、"b"、"c"、"c"] です。

しかし、関数を書き込もうとすると..

results :: [a] -> [(Int, a)]
results = sort (frequency score)

残念ながら、並べ替えが適用される引数が多すぎると言ってうまくいきません。

明らかな質問で申し訳ありませんが、事前に感謝します。

4

2 に答える 2

9

関数に引数を取るのを忘れました。

results :: [a] -> [(Int, a)]
results score = sort (frequency score)

それがなければ、コンパイラはあなたの型シグネチャを見て、 type の何かを返すために[a] -> [(Int, a)]sortの引数を取る必要があると推測しますが、そうではありません。

ただし、次の問題は、任意のコンポーネント タイプを持つタプルのリストを並べ替えることができないことです。それに対処する方法については、@luquiの回答を参照してください。

于 2012-05-01T23:00:41.490 に答える
4

sort適用された引数が多すぎると言っていますか? 私には、間違った型シグネチャを与えたようです。これは簡単に機能する可能性があります。

results :: (Ord a) => [a] -> [(Int, a)]

(つまり、 が eringを持つタイプで[(Int, a)]ない限り、リストをソートすることはできません。つまり、要素を比較できます)。aOrd

ただし、この署名は実際には必要ありません。またsortBy (\x y -> compare (fst x) (fst y))、慣用的な簡潔な方法がいくつかありますが、初心者にとっては明示的である方がよいと思います。aこの方法では s のみを見るので、sを比較する必要はありませんInt

編集:そうそう、sortあまりにも多くの引数が適用されていると言う理由がわかります。@hammarの回答を参照してください。

于 2012-05-01T23:01:51.730 に答える