Haskell按总和排序子列表

时间:2018-03-29 02:01:24

标签: list haskell

给定Haskell中的整数列表列表,如何根据每个子列表中的值的总和对其子列表进行排序?即,如果给出的清单是:

[[5,3],[1,1,1,1],[2],[10,22,0]]

函数的输出将是:

[[2],[1,1,1,1],[5,3],[10,22,0]]

注意:每个子列表中的元素数量无关紧要,我只需要按其总和按升序排序的子列表。我该怎么做呢?谢谢!

2 个答案:

答案 0 :(得分:5)

所有这些方法都有效:

sortBySums = sortBy (\l r -> (compare (sum l) (sum r))) -- taken from pdoherty926
sortBySums = sortBy (compare `on` sum)
sortBySums = sortBy (comparing sum)
sortBySums = sortOn sum

sortOn的优点是它使用Schwartzian变换,即它只为每个元素计算一次总和。

从内存导入,无法在https://www.haskell.org/

上导入
import Data.List(sortBy,sortOn)
import Data.Function(on)
import Data.Ord(compare,comparing)

答案 1 :(得分:2)

这样的事情怎么样?

import Data.List

sortBySums :: (Ord a, Foldable t, Num a) => [t a] -> [t a]
sortBySums = sortBy (\l r -> (compare (sum l) (sum r)))