我有一个困难时期,当我试图通过第二元素顺序,列出的名单,像这样
list = [[_,B,_,_,_],[_,A,_,_,_],[_,C,_,_,_]]
这个:
list = [[_,A,_,_,_],[_,B,_,_,_],[_,C,_,_,_]]
我试过了:
sortBy compare $ [([1,2]!!1),([2,3]!!1)]
但它过滤秒元素,并命令进入[2,3]
。
什么你试图做的排序是列表[([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)
我想出了另一个想法是简单地通过使用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)