Haskell:排序树木列表

时间:2017-05-01 10:57:16

标签: list sorting haskell

我有一个具有相关数值的树列表(我们可以将其视为对此情况下的Int列表进行排序),我想从最高到最低排序整个列表并返回新的排序列表。我该怎么做呢?我遇到了内置列表排序功能,例如sortBy,但我不了解如何实现它。

如果不是很明显,我也很擅长编码;)

1 个答案:

答案 0 :(得分:1)

基本上,你可以写你的功能

score :: Tree -> Int

为每棵树提供分数。上面的分数是Int,但任何其他有序类型都可以作为分数。

然后,您可以使用

sortBy (flip $ comparing score) myListOfTree

根据分数排序。请务必为Data.Ord导入comparing

请注意,这可以多次计算得分。如果您的分数功能很昂贵,您可能需要预先计算分数,如下所示:

map snd . sortBy (flip $ comparing fst) . map (\t -> (score t, t)) $ myListOfTree

另一个选择是直接定义你自己的比较功能

compareTree :: Tree -> Tree -> Ordering
compareTree t1 t2 | someCondition       = LT   -- t1 <  t2
                  | someOtherCondiction = EQ   -- t1 == t2
                  | otherwise           = GT   -- t1 >  t2

如果您愿意,可以在条件中使用您的分数功能。

然后使用sortBy compareTree按升序排序,或使用sortBy (flip compareTree)进行降序排序。

如果这个订单只是&#34;自然&#34;订购Tree类型,您甚至可以声明:

instance Ord Tree where
   compare = compareTree

(但请注意,此方法会多次调用compareTree,每次比较一次,可能反复计算得分。因此,上面显示的map解决方案可能仍然是首选。)< / p>