2

嗨,我是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可以解决,但是我也尝试过这个,发现所取的单词没有首先排序,因此没有给我想要的结果。

谢谢

4

1 回答 1

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该函数的输出。

于 2017-12-25T17:24:39.793 回答