Haskell-分类后如何从元组清单中获取n个项目



嗨,我是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函数。如果有一种在调用sortWords之前可以执行take的方法,但是我还尝试了此问题,并发现未先排序这些单词,因此不会给我我想要的结果。

谢谢

这里的问题是 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应用于该功能的输出。

最新更新