【发布时间】:2012-03-13 07:50:07
【问题描述】:
嘿,我有一个看起来像这样的元组列表
[("x", [1,2,3]), ("y", [1,2]), ("z", [1,2,3,4])]
我想根据作为元组中的第二个元素的整数列表的长度按升序对列表进行排序,但是我的 haskell 充其量是很差的,我想不出办法来做到这一点。
【问题讨论】:
标签: list sorting haskell functional-programming tuples
嘿,我有一个看起来像这样的元组列表
[("x", [1,2,3]), ("y", [1,2]), ("z", [1,2,3,4])]
我想根据作为元组中的第二个元素的整数列表的长度按升序对列表进行排序,但是我的 haskell 充其量是很差的,我想不出办法来做到这一点。
【问题讨论】:
标签: list sorting haskell functional-programming tuples
大部分排序问题都可以通过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])]
【讨论】:
sortBy (comparing $ length . snd) [("x", [1,2,3]), ("y", [1,2]), ("z", [1,2,3,4])]
【讨论】:
sortBy不在Prelude,而是Data.List,而comparing在Data.Ord