List 按秒元素对列表列表进行排序
当我试图按第二个元素排序列表时,我遇到了一个困难,类似这样的事情List 按秒元素对列表列表进行排序,list,sorting,haskell,compare,List,Sorting,Haskell,Compare,当我试图按第二个元素排序列表时,我遇到了一个困难,类似这样的事情 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],通过比较。您
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]
,通过比较。您要做的是使用sortBy
函数,该函数首先获取第二个元素,然后比较:
sortBySecond = sortBy (\ a b -> compare (a !! 1) (b !! 1))
然后获取您拥有的列表,并对其应用此函数:
sortBySecond [[1, 2], [2, 3]]
您可以使用数据中的on
使此函数更整洁。函数
:
import Data.Function
sortBySecond = sortBy (compare `on` (!! 1))
您还可以使用比较数据中的。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)
谢谢你的帮助,伙计,我试过你的第二个选择,因为第一个只适合两个列表,但是当我加载代码时,我得到了这样一个错误:无法将调用的返回类型中的预期类型a0->a0->Ordering'与实际类型Ordering'匹配,在sortBy的第一个参数中为compare',即表达式中的“(compare on(!!1)):sortBy(compare on(!!1)),首先,我的两个解决方案是相同的——它们在完全相同的情况下都能工作。其次,这里的代码格式很难看到`
,所以你是在`(!!1)
上写比较`(!!1)
还是在(!!1)
上写比较?你说得对,伙计,我复制了你的代码,文本编辑器放了另一个字符而不是正确的字符。现在我可以加载这个函数了,但是当我运行“sortBySecond”时,我得到了这样一个结果:“由于使用了'print'可能的修复程序而导致的(Show([[b0]]->[[b0]])没有实例:为(Show([[b0]]]->[[b0]])添加一个实例声明)在交互式GHCi命令的stmt中:打印它通过GHCi中的let sortBysecond=…
绑定它是有问题的。单态限制将使GHCi将其默认为sortBysecond::[()]->[()]]
。您可以1.使用签名绑定它,let sortBysecond::Ord a=>[[a]->[()]]->[[a]];sotrBySecond=…
,2.使用参数绑定,让sortBySecond xs=…
,3.禁用MR,:在提示符处设置-Xnomonomonomorphismrestriction
。请注意,比较foo=compare'on'foo