嗨,我是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
应用于该功能的输出。