Haskell - 排序

时间:2017-12-25 17:09:17

标签: list haskell take

您好我是haskell的初学者。我想从这个元组列表中获取前3个项目:

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

首先,我按频率和降序对列表进行排序:

sortWords =  sortBy(flip compare `on` snd)

这给了我结果:

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

然后我知道我可以做这个功能:

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

它为我提供了[("and",2),("the",2),("cat",1)]

所需结果

但是,我希望能够将take函数合并到sortWords函数中。问题是,当我尝试这样做时,例如:

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

这不起作用。

理想情况下,我希望将sortWords作为结束函数,因此我不想将其传递给另一个函数以便能够执行take函数。如果在调用take之前有一种方法可以执行sortWords这可能是一个解决方案,但我也尝试了这一点,并发现所采用的单词不是先排序,因此不会给出我想要的结果。

谢谢

1 个答案:

答案 0 :(得分:7)

这里的问题是sortBy (flip compare `on` snd) 一个元组列表,它是一个函数,它将元组列表作为输入并返回元组列表。

我们可以使用函数组合运算符(.) :: (b -> c) -> (a -> b) -> a -> c

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

这里我们首先在输入上应用sortBy (flip compare `on` snd),然后我们将take 3应用于该函数的输出。