Haskell函数根据子列表的长度对整数列表的列表进行排序

时间:2018-11-03 23:49:58

标签: haskell

我有一个列表:

[[1,2],[1,2,3],[2,3],[4],[1,2,5,4],[2,3,1]]

我想按照子列表的升序和长度对列表进行排序

像这样:

[[4],[1,2],[2,3],[1,2,3],[2,3,1],[1,2,5,4]]

我找到了一个解决方案,但这不是我想要的

我发现了这个功能:

import Data.List

doubleSort :: (Ord a, Num a) => [[a]] -> [[a]]
doubleSort = sortOn sum . map sort

但这会以我不希望的方式对列表进行排序:

[[1,2],[4],[2,3],[1,2,3],[1,2,3],[1,2,4,5]]

2 个答案:

答案 0 :(得分:3)

sort{[By,On]}是稳定的排序,因此您可以简单地按次要标准,然后再按主要标准进行排序。

> :m +Data.List
> sortOn length $ sort [[1,2],[1,2,3],[2,3],[4],[1,2,5,4],[2,3,1]]
[[4],[1,2],[2,3],[1,2,3],[2,3,1],[1,2,5,4]]

如果已经按照字典顺序进行了排序,那么仅使用sortOn length就可以了。

答案 1 :(得分:3)

带有一个sort

> sortOn (length &&& sum)

&&&来自Control.Arrow