2

私は取る高次関数を持っています:

results ["Red", "Blue", "Green", "Blue", "Blue", "Red"]

そして戻る:

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

results 関数を使用して、winner という新しい関数を作成する必要があります。

winner :: [Party ] -> Party
winner xs = 

これは、最も多く発生した色を出力し、タプル内の最初の要素を削除します。2 つの色が同じ発生である場合、2 つの色を出力します。次に例を示します。

winner ["Red", "Blue", "Green", "Blue", "Blue", "Red"]

出力:

"blue"

これまでのところ、snd と tail を使用してみましたが、エラーが発生し続けます。前もって感謝します。

4

4 に答える 4

10

機能があればresults、簡単なアプリケーション

maximumBy :: (a -> a -> Ordering) -> [a] -> a

十分でしょう

import Data.List -- for maximumBy
import Data.Ord  -- for comparing

winner = snd . maximumBy (comparing fst) . results

見る

2 つの色が同じオカレンスを持つ場合、2 つの色を出力します

別のタイプが必要です-もちろん、別の実装が必要ですが、ライブラリ関数を使用すると簡単です。

import Data.List
import Data.Ord
import Data.Function

winners :: [Party] -> [Party]
winners = map snd . head . groupBy ((==) `on` fst) . sortBy (flip $ comparing fst) . results

ソートされたリストが既に生成されているためresults、出力例だけに依存したくなかったため、再度ソートする必要はなく、次を使用できます。

winners = map snd . last . groupBy ((==) `on` fst) . results

最も出現頻度の高いすべての要素のリストを作成します。最も頻度の高い要素が 1 つだけ必要な場合は、次のようにして取得できます。

winner = snd . last . results

並べ替えられた頻度リストから。

于 2012-04-16T21:32:10.917 に答える
5
import Data.List
import Data.Ord
winner xs = head . maximumBy (comparing length) . group . sort $ xs
main = print  $ winner ["Red", "Blue", "Green", "Blue", "Blue", "Red"]

最も直接的な方法のように見えます。

于 2012-04-17T00:27:37.253 に答える
3

並べ替えを避けたい場合は、関数を持つMultiSetfinMaxを使用できます。

于 2012-04-17T06:45:35.617 に答える
1

このwinners関数では、 のリストを取得します。このリストはString、関数を適用して '(Int, String)' タプルのリストに変換できresultsます。results次に、それらのタプルの最後のものを取得し (出現回数の昇順で要素を返すと仮定)、そのタプルの 2 番目の要素を返します。関数を試したことはすでに述べているsndので、唯一の問題は、タプルのリストの最後の要素を取得する中間ステップにありますね。

その最後の要素を返す関数の型は何ですか? タプルのリストを取り、(Int, String)単一のタプルを返すため、タイプの推測は である可能性があります[(Int, String)] -> (Int, String)が、関数はリスト内のタプルを扱っていることを実際に知る必要はありません。リストの最後の要素を返す必要があるだけなので、より良い型は[a] -> a​​ . この型を用意して、 Hoogleに移動し、検索ボックスに入力すると、必要な関数が 2 番目の結果として得られます。

これは、単一の結果のみを返す勝者関数には十分です。複数の結果を返すことができるようにしたい場合は、ダニエル・フィッシャーが回答で指摘しているように、別の署名と少し複雑な実装が必要です。最も簡単な方法は、出現回数が最大でないタプルを除外することによって、最後のタプルと同じ出現を持つすべてのタプルを見つけることだと思います (ここでも出現の昇順を想定しています)。リストをマッピングすることにより、タプルのリストをそれらのタプルの 2 番目の要素のsndリストに変換します。

winners :: [String] -> [String]
winners xs = map snd maxOccursTuples
    where maxOccursTuples = filter isMaxOccursTuple occurrences
          isMaxOccursTuple tuple = fst tuple == maxOccurs
          maxOccurs = fst (last occurrences)
          occurrences = results xs
于 2012-04-16T22:11:39.307 に答える