您好我是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
这可能是一个解决方案,但我也尝试了这一点,并发现所采用的单词不是先排序,因此不会给出我想要的结果。
谢谢
答案 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
应用于该函数的输出。