给定Haskell中的整数列表列表,如何根据每个子列表中的值的总和对其子列表进行排序?即,如果给出的清单是:
[[5,3],[1,1,1,1],[2],[10,22,0]]
函数的输出将是:
[[2],[1,1,1,1],[5,3],[10,22,0]]
注意:每个子列表中的元素数量无关紧要,我只需要按其总和按升序排序的子列表。我该怎么做呢?谢谢!
答案 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)))