List 在Haskell中排序列表

List 在Haskell中排序列表,list,haskell,List,Haskell,假设我有一个列表,如[[1,3,4],[1,5,6,7],[2,8,0]或[“QQQ”,“rrrrr”,“ttttttt”],是否有一个函数可以根据内部列表中元素的数量对它们进行排序,即在Int列表中,4个元素列表位于前面,在字符串的列表中,Ts转到前面,然后Rs?与自定义谓词一起使用: Prelude> import Data.List Prelude Data.List> let l = [[1,3,4],[1,5,6,7],[2,8,0]] Prelude Data.List&

假设我有一个列表,如
[[1,3,4],[1,5,6,7],[2,8,0]
[“QQQ”,“rrrrr”,“ttttttt”]
,是否有一个函数可以根据内部列表中元素的数量对它们进行排序,即在
Int
列表中,4个元素列表位于前面,在
字符串的列表中,
T
s转到前面,然后
R
s?

与自定义谓词一起使用:

Prelude> import Data.List
Prelude Data.List> let l = [[1,3,4],[1,5,6,7],[2,8,0]]
Prelude Data.List> sortBy (\e1 e2 -> compare (length e2) (length e1))  l
[[1,5,6,7],[1,3,4],[2,8,0]]
编辑:感谢@JJJ提供了一个更漂亮的变体

Prelude Data.List> import Data.Ord
Prelude Data.List Data.Ord> sortBy (flip $ comparing length) l
[[1,5,6,7],[1,3,4],[2,8,0]]
与自定义谓词一起使用:

Prelude> import Data.List
Prelude Data.List> let l = [[1,3,4],[1,5,6,7],[2,8,0]]
Prelude Data.List> sortBy (\e1 e2 -> compare (length e2) (length e1))  l
[[1,5,6,7],[1,3,4],[2,8,0]]
编辑:感谢@JJJ提供了一个更漂亮的变体

Prelude Data.List> import Data.Ord
Prelude Data.List Data.Ord> sortBy (flip $ comparing length) l
[[1,5,6,7],[1,3,4],[2,8,0]]

sortBy
来自数据。列出并比较数据。Ord将帮助您

foo = sortBy (comparing (negate . length))

bar = foo ["QQQ", "RRRR", "TTTTT"]

sortBy
来自数据。列出并比较数据。Ord将帮助您

foo = sortBy (comparing (negate . length))

bar = foo ["QQQ", "RRRR", "TTTTT"]

我想添加另一个解决方案,用于记忆给定列表的长度。否则,每次比较都会重新计算长度,这将意味着大型列表的大量开销

import Control.Arrow ((&&&))
import Data.List (sort, sortBy)
import Data.Ord (comparing)

sortByLen :: [[a]] -> [[a]]
sortByLen = map snd . sortBy (comparing fst) . map ((negate . length) &&& id)
如果您还希望相同长度的列表按字典顺序排序,可以使用稍微简单一点的方法

sortByLen' :: (Ord a) => [[a]] -> [[a]]
sortByLen' = map snd . sort . map ((negate . length) &&& id)

我想添加另一个解决方案,用于记忆给定列表的长度。否则,每次比较都会重新计算长度,这将意味着大型列表的大量开销

import Control.Arrow ((&&&))
import Data.List (sort, sortBy)
import Data.Ord (comparing)

sortByLen :: [[a]] -> [[a]]
sortByLen = map snd . sortBy (comparing fst) . map ((negate . length) &&& id)
如果您还希望相同长度的列表按字典顺序排序,可以使用稍微简单一点的方法

sortByLen' :: (Ord a) => [[a]] -> [[a]]
sortByLen' = map snd . sort . map ((negate . length) &&& id)

所以,所以,
\e1 e2->compare(length e2)(length e1)
=
flip$comparing length
。您可以通过导入
数据.ord.comparing
使排序比较器更干净。然后你可以写
sortBy(比较长度)l
我实际上想的更多的是
比较
,而不是
比较
:-)
\e1 e2->compare(length e2)(length e1)
=
翻转$comparing length
。通过导入
数据.ord.comparing
,可以使排序比较器更干净。然后你可以写
sortBy(比较长度)l
我实际上想的更多的是
比较
,而不是
比较
:-)