当我尝试通过第二个元素订购列表列表时遇到了困难,就像这样
list = [[_,B,_,_,_],[_,A,_,_,_],[_,C,_,_,_]]
进入这个:
list = [[_,A,_,_,_],[_,B,_,_,_],[_,C,_,_,_]]
我试过了:
sortBy compare $ [([1,2]!!1),([2,3]!!1)]
但它会过滤秒元素并将其排入[2,3]
。
答案 0 :(得分:9)
您尝试做的是按[([1,2]!!1),([2,3]!!1)]
对列表[2, 3]
进行排序,该列表相当于compare
。您希望做的是使用sortBy
函数,该函数首先得到第二个元素,然后进行比较:
sortBySecond = sortBy (\ a b -> compare (a !! 1) (b !! 1))
然后获取您拥有的列表并将此功能应用于它:
sortBySecond [[1, 2], [2, 3]]
您可以使用on
中的Data.Function
:
import Data.Function
sortBySecond = sortBy (compare `on` (!! 1))
您还可以使用comparing
中的Data.Ord
:
sortBySecond = sortBy $ comparing (!! 1)
答案 1 :(得分:0)
我提出的另一个想法是使用tail
简单地在列表的第二个元素处开始排序。我也试着点免费写它 - 就像我的练习一样。
pfsortBySnd :: (Ord a) => [[a]] -> [[a]]
pfsortBySnd = sortBy second
where second = comparing tail
sortBySnd :: (Ord a) => [[a]] -> [[a]]
sortBySnd xx = sortBy second xx
where second x y = compare (tail x) (tail y)