我有一个具有相关数值的树列表(我们可以将其视为对此情况下的Int列表进行排序),我想从最高到最低排序整个列表并返回新的排序列表。我该怎么做呢?我遇到了内置列表排序功能,例如sortBy,但我不了解如何实现它。
如果不是很明显,我也很擅长编码;)
答案 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>