当我尝试按第二个元素对列表的列表进行排序时,遇到困难,例如:
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]]
您可以通过使用来自 Data.Function
的 on
使这个函数更加简洁:
import Data.Function
sortBySecond = sortBy (compare `on` (!! 1))
Data.Ord
中的comparing
函数: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)
a0 -> a0 -> Ordering' 与实际类型
Ordering' 在调用compare' 的返回类型中 在
sortBy' 的第一个参数中 即表达式 `(compare on (!! 1))' - seph\
,所以你是写了compare \
on` (!! 1)还是
compare on (!! 1)`? - Tikhon Jelvislet sortBysecond = ...
绑定它会有问题。单态性限制将使ghci将其默认为sortBySecond :: [[()]] -> [[()]]
。你可以选择:1. 使用签名绑定,let sortBySecond :: Ord a => [[a]] -> [[a]]; sotrBySecond = ...
,2. 使用参数绑定,let sortBySecond xs = ...
,3. 在提示符上禁用MR,:set -XNoMonomorphismRestriction
。 - Daniel Fischercomparing foo = compare 'on' foo
。 - Dan Burtonon\\\\`` ==>
`on``。 - Tikhon Jelvis