haskell排序

gru*_*ber 9 sorting haskell tuples

如何以最简单的方式编写(或者可能有嵌入haskell中的内容)函数,它作为元组(String,Int)和Int x的参数列表,并根据x值返回顶部x元组作为列表.

我想知道是否有可能编写一个函数,该函数也需要3个参数,这是在元组中提交的(或索引)的名称,根据哪个必须进行排序.

什么是使其非常通用的最佳解决方案?

jkr*_*mer 24

take x $ sortBy (compare `on` fst) [("asd", 1), ...]
Run Code Online (Sandbox Code Playgroud)

take x从排序列表中获取前x个项目.sortBy使用作为第一个参数给出的排序函数对作为第二个参数给出的列表进行排序.(compare `on` fst)比较每个元组的第一个值.请注意,此示例比较每个元组的第一个值以进行排序.要按第二个值排序,请替换fstsnd.

您会看到该sortBy函数非常通用,因为它允许您定义用于比较值的函数.该函数有两个参数,应该返回LT,EQ或GT中的一个.请注意,该函数compare需要两个参数派生自Ord.辅助函数on可以在模块中找到Data.Function.该功能sortBy在模块中Data.List.

编辑:这是一个完整的工作示例,通过比较它们的第一个值来排序元组列表,并打印结果列表的前2个元组.请注意,我用on上面的示例替换了上面的示例,该函数显示了on内部的内容.

import Data.Function
import Data.List

main = print $ mySort [("foo", 1), ("bar", 2), ("baz", 3), ("quux", 4)] 2

mySort list x = take x $ sortBy (\ x y -> compare (fst x) (fst y)) list
Run Code Online (Sandbox Code Playgroud)

编辑:正如Tom Lokhorst在他的评论中指出的那样,comparing模块中的函数Data.Ord是一个更易读的替换/快捷方式on compare,所以上面的内容也可以写成sortBy (comparing fst).

  • 请注意,`Data.Ord`中的`comparison`函数与`on compare`相同.所以你也可以写`sortBy(比较fst)list`. (8认同)