如何对此列表进行排序
[("apple",3),("apple",-2),("pear",1)]
由元组中的第二个元素和绝对值,所以
[("pear",1),("apple",-2),("apple",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
,然后按新密钥排序。