在Haskell中对谓词进行二维列表排序

时间:2012-12-20 18:37:46

标签: sorting haskell

我有一个元组列表([[(Int, Custom)]])的列表,我想通过比较整数来对外部列表进行排序。它应该像普通的二维排序一样,即它应该按照第一个列表项排序第一个,然后按第二个项排序等等 - 但是比较第一个部分而不是整个元组。

对于一维列表,我会使用sortBy (comparing fst),但我完全迷失了将它们包装在另一个列表中。我知道如果我将Custom Ord的实例设为{{3}},因为排序会自动生成,但它确实可以自动生效。

如果您想要一个示例和预期结果,请发表评论。提前谢谢!

1 个答案:

答案 0 :(得分:3)

呃,在问了这个问题之后,就像是中风一样:

comparing需要一个返回可订购结果的函数,而不是Ordering或已排序的部分列表[(Int, Custom)](这是不可订的):

comparing :: Ord a => (b -> a) -> b -> b -> Ordering
comparing = on compare

所以我必须返回的是可订购整数的列表,即map fst。共:

sortBy (compare `on` map fst)
  :: Ord a => [[(a, b)]] -> [[(a, b)]]