【问题标题】:Sorting a list of lists by the seconds element按秒元素对列表列表进行排序
【发布时间】:2012-01-07 20:13:03
【问题描述】:

当我尝试按第二个元素对列表列表进行排序时,我遇到了困难,就像这样

list = [[_,B,_,_,_],[_,A,_,_,_],[_,C,_,_,_]]

进入这个:

list = [[_,A,_,_,_],[_,B,_,_,_],[_,C,_,_,_]]

我试过了:

sortBy compare $ [([1,2]!!1),([2,3]!!1)]

但它会过滤秒元素并将其排序为[2,3]

【问题讨论】:

    标签: list sorting haskell compare


    【解决方案1】:

    您尝试做的是将列表[([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)
    

    【讨论】:

    • 感谢您的帮助,我已经尝试了您的第二个选项,因为第一个选项只适合 2 个列表,但是当我加载代码时出现此错误:无法匹配预期类型 @ 987654333@Ordering' 在compare' In the first argument of sortBy' 的调用的返回类型中,即`(compare on (!! 1))' 在表达式中:sortBy (compare on (!! 1))
    • 首先,我的两个解决方案是相同的——在完全相同的情况下都可以工作。其次,这里的代码格式很难看到`,所以你写的是compare `on` (!! 1)还是compare on (!! 1)
    • 你是对的伙伴,我复制了你的代码,文本编辑器用另一个字符代替了正确的字符。现在我可以加载该函数,但是当我运行“sortBySecond”时,我得到这个:“没有实例(显示([[b0]] -> [[b0]]))因使用'print'而产生可能的修复:添加(Show ([[b0]] -> [[b0]])) 的实例声明在交互式 GHCi 命令的 stmt 中:打印它
    • 在 ghci 中通过 let sortBysecond = ... 绑定它是有问题的。单态性限制将使 ghci 默认为sortBySecond :: [[()]] -> [[()]]。您可以 1. 用签名绑定它,let sortBySecond :: Ord a => [[a]] -> [[a]]; sotrBySecond = ...,2. 用参数绑定,let sortBySecond xs = ...,3. 在提示符下禁用 MR,:set -XNoMonomorphismRestriction
    • 请注意comparing foo = compare 'on' foo
    【解决方案2】:

    我想出的另一个想法是使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 2018-03-08
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      • 2016-07-17
      相关资源
      最近更新 更多