按照第二个元组元素对元组列表进行排序

4

可能是重复的问题:
按元组的第二个元素对列表进行排序

嘿,我有一个看起来像这样的元组列表

[("x", [1,2,3]), ("y", [1,2]), ("z", [1,2,3,4])]

我希望按照元组中第二个元素 - 整数列表的长度,以升序方式对列表进行排序。但是,我的Haskell编程能力很弱,无法找到解决方法。

2个回答

11

使用 sortBy ::(a -> a -> Ordering) -> [a] -> [a] 函数可以解决大部分排序问题。因此,任务是生成一个比较两个元素的排序函数,该函数基于元组的第二个元素的长度进行比较。compare `on` (length . snd) :: (a1, [a]) -> (a1, [a]) -> Ordering 是我们实际需要的。

eblo> sortBy (compare `on` (length . snd)) [("x", [1,2,3]), ("y", [1,2]), ("z", [1,2,3,4])]
[("y",[1,2]),("x",[1,2,3]),("z",[1,2,3,4])]

1
你不能在代码区块内使用Markdown语法,但是你可以将整个代码区块包裹在一个链接中。 - Tikhon Jelvis

11
sortBy (comparing $ length . snd) [("x", [1,2,3]), ("y", [1,2]), ("z", [1,2,3,4])]

6
请参考(供其他读者参考),sortBy不在Prelude中,而在Data.List中,而comparing在Data.Ord中。 - Alex Moore-Niemi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接