2017-12-25 27 views
2

こんにちは私は初心者です。Haskell - 並べ替えの後にタプルリストからn個の項目を取り出す方法

[("and",2),("the",2),("cat",1),("dog",1),("rabbit",1)] 
:これは私に結果を与える

sortWords = sortBy(flip compare `on` snd) 

:周波数でリストをソートし、降順

[("and",2),("cat",1),("dog",1),("rabbit",1),("the",2)] 

まずI:私はこのタプルのリストから最初の3つの項目を取得しようとしています

次に、私は機能を果たすことができることを知っています:

take 3 [("and",2),("the",2),("cat",1),("dog",1),("rabbit",1)] 
しかし私に [("and",2),("the",2),("cat",1)]

希望結果を与える

は、私がsortWords関数にtake機能を組み込むことができるようにしたいです。問題は、これを実行しようとすると次のようになります。

sortWords = take 3 (sortBy(flip compare `on` snd)) 

これは機能しません。

機能を実行できるように、私はそれを別の関数に渡したくないので、理想的には、sortWordsを終了関数として保持したいと考えています。しかし、takeを実行して、解決策になるsortWordsを呼び出す前に、私はこれを試して、取った言葉が最初にソートされていないことを知っています。

ここでの問題はsortBy (flip compare `on` snd)タプルのリストではないということです

答えて

7

ありがとう、それは、入力としてタプルのリストを取り、タプルのリストを返す関数です。私たちは、このように最初の入力にsortBy (flip compare `on` snd)を適用し、その後、我々はその関数の出力にtake 3を適用するここ

sortWords :: Ord b => [(a,b)] -> [(a,b)] 
sortWords = take 3 . sortBy (flip compare `on` snd) 

我々は関数合成演算子(.) :: (b -> c) -> (a -> b) -> a -> cを使用することができます。

+0

それは働いた。ありがとうございました :) – k1r4n

関連する問題