2012-05-01 13 views
1
それはちょうど私がのhaskellが非常に新たなんだだ簡単な質問のため申し訳ありません

..機能 - Haskellの

私はタプルのリストをソートする関数「オーダー」を書き込むしようとしています(例えば、周波数aabbbcccのような結果を与えるリスト中の別個の要素の数を数えると、結果は[(2、a)、(3、b)、( 3、c)])を昇順に並べる。私はそれを書く方法を考えることができません。

私は前奏曲に>ソート(頻度スコア)を記述する場合、それは(等級のリスト、すなわち[ "A"、 "B"、 "C"、 "C"]というスコアでソートされます。

しかし、私は関数を記述してみてください。..

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

それは悲しげにその種があまりにも多くの引数に適用されると言って動作しません。事前に明白な疑問と感謝のため

申し訳ありません。

答えて

8

あなたは忘れてしまったあなたの関数を引数にする。それがなければ

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

、コンパイラがあなたのタイプの署名を見て、タイプ[a] -> [(Int, a)]の何かを返すために、sortはそうでない別の引数を取る必要があることを推測します。

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

+2

'sort'では' a'の 'Ord'制約が必要であることに注意してください。 –

4

sortには引数が多すぎますか?私には、間違ったタイプの署名を与えたようです。これは、簡単に作業があります。

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

aあなたは要素を比較することができますですOrd eringを、持っているタイプでない限り、つまりあなたが[(Int, a)]のリストを並べ替えることはできません)。

しかし、このシグネチャは実際には必要ではありません。sortBy (\x y -> compare (fst x) (fst y))もありますが、それは慣用的な簡潔な方法がいくつかありますが、初心者にとっては明示的である方が良いと思います。この方法では、Intしかないので、aを比較する必要はありません。

を編集してください。なぜかsortにはあまりにも多くの引数が適用されます。 @ hammarの答えを見てください。

関連する問題