按元组列表的第二个元素和绝对值对元组列表进行排序

时间:2014-10-31 07:52:02

标签: sorting haskell tuples

如何对此列表进行排序

[("apple",3),("apple",-2),("pear",1)]

由元组中的第二个元素和绝对值,所以

[("pear",1),("apple",-2),("apple",3)]

3 个答案:

答案 0 :(得分:4)

怎么样:

import Data.Ord (comparing)
import Data.List (sortBy)

sortBy (comparing (\(x,y) -> abs y)) [("apple",3),("apple",-2),("pear",1)]

这是我在Haskell写的第一件事,所以我不介意有人指出为什么这是错的以及如何改进它。

在@WillNess对原始问题的评论之后,这是一个试图使用“decorate-sort-undecorate”模式的版本:

[ (a,b) | (foo,a,b) <- sort [ (abs b,a,b) | (a,b) <- x ] ]

其中x是原始列表。

答案 1 :(得分:3)

import Data.Function
import Data.List

sortBy (compare `on` abs . snd) [("apple",3),("apple",-2),("pear",1)]

答案 2 :(得分:2)

这是一个复述的方法:

import Data.List
import GHC.Exts

sortWith (abs . snd) [("apple",3),("apple",-2),("pear",1)]

您可以将其应用于已转换的密钥 容器进行排序的任何问题。

在您的情况下,abs . snd函数用于将("Foo", -5)转换为5,然后按新密钥排序。