Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 按秒元素对列表列表进行排序_List_Sorting_Haskell_Compare - Fatal编程技术网

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