Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 按元组的第二个元素和绝对值对元组列表进行排序_Sorting_Haskell_Tuples - Fatal编程技术网

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

Sorting 按元组的第二个元素和绝对值对元组列表进行排序,sorting,haskell,tuples,Sorting,Haskell,Tuples,如何对该列表进行排序 [("apple",3),("apple",-2),("pear",1)] 通过元组中的第二个元素和绝对值 [("pear",1),("apple",-2),("apple",3)] 那么: import Data.Ord (comparing) import Data.List (sortBy) sortBy (comparing (\(x,y) -> abs y)) [("apple",3),("apple",-2),("pear",1)] 这是我用Has

如何对该列表进行排序

[("apple",3),("apple",-2),("pear",1)]
通过元组中的第二个元素和绝对值

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

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

sortBy (comparing (\(x,y) -> abs y)) [("apple",3),("apple",-2),("pear",1)]
这是我用Haskell写的第一篇文章,所以如果有人指出这是错误的原因以及如何改进,我不会介意

在@WillNess对原始问题的评论之后,下面是一个尝试使用“装饰-排序-取消装饰”模式的版本:

[(a,b)|(foo,a,b)怎么样:

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

sortBy (comparing (\(x,y) -> abs y)) [("apple",3),("apple",-2),("pear",1)]
这是我用Haskell写的第一篇文章,所以如果有人指出这是错误的原因以及如何改进,我不会介意

在@WillNess对原始问题的评论之后,下面是一个尝试使用“装饰-排序-取消装饰”模式的版本:


[(a,b)|(foo,a,b)这里有一个解释方法:

import Data.List
import GHC.Exts

sortWith (abs . snd) [("apple",3),("apple",-2),("pear",1)]
您可以将其应用于任何需要通过转换键对容器进行排序的问题


在您的例子中,
abs.snd
函数用于将
(“Foo”,-5)
转换为
5
,然后按新键排序。

这里有一种解释方法:

import Data.List
import GHC.Exts

sortWith (abs . snd) [("apple",3),("apple",-2),("pear",1)]
您可以将其应用于任何需要通过转换键对容器进行排序的问题


在你的例子中,
abs.snd
函数用于将
(“Foo”,-5)
转换为
5
,然后按新键排序。

除非你想像@jamshidh的答案那样不受限制,否则我唯一想做的改变就是删除
y
@rjanJohansen周围的括号谢谢你的有用评论!澄清问题“无点”评论,你可以改为写
比较(abs.snd)
比较$abs.snd
。但我同意,你的代码很棒。@MichaelSnoyman是的,在谷歌搜索了一下之后,我有点明白了“无点”的意思。不过,我不知道为什么一个版本比另一个版本更受欢迎:关于“惯用”"代码、可读性、用例等等。这是我一直在努力为自己弄清楚的。这实际上只是一个品味问题,在这方面的品味实际上有很大的不同。在我看来,你所写的是完全有效的、惯用的Haskell代码。除非你想像@jamshidh的答案那样毫无意义,否则我唯一想改变的就是删除paren关于
y
@rjanJohansen的论文谢谢你的有用评论!为了澄清“无点”评论,你可以写
comparing(abs.snd)
comparing$abs.snd
。但是我同意,你的代码很棒。@MichaelSnoyman是的,我有点“无点”了意思是,在谷歌搜索之后。然而,我不知道为什么一个版本比另一个版本更受欢迎:关于“惯用”代码、可读性、用例等等。这是我一直在努力为自己弄明白的。这实际上只是一个品味的问题,在这方面的品味实际上有很大的不同。你所写的是完全有效的、惯用的Haskell代码。
sortWith f==sortBy(比较f)==sortBy(比较
on`f)`。它们都是完全一样的,一件事。尽管可以进一步讨论的是模式。@Willenss是我的另一个答案,与你的评论所指的方向一致?@Boris通常需要一个昂贵的“钥匙”(即“排序依据”)函数;这里不需要它,因为只有
abs
会被重新计算多次,而且它很便宜。第二个函数很接近,但与其使用
sort
,不如使用
sortBy(比较fst3)…其中fst3(a,,)=a
,以消除其他字段对排序的任何影响(对于重复键)。此外,您不必使用
fst3
,通常会以嵌套方式排列数据,因此可以使用普通的
fst
sortWith f==sortBy(比较f)==sortBy(比较`f上的
)`。它们都是完全一样的,一件事。尽管可以进一步讨论的是模式。@Willenss是我的另一个答案,与你的评论所指的方向一致?@Boris通常需要一个昂贵的“钥匙”(即“排序依据”)函数;这里不需要它,因为只有
abs
会被重新计算多次,而且它很便宜。第二个函数很接近,但与其使用
sort
,不如使用
sortBy(比较fst3)…其中fst3(a,,)=a
,以消除其他字段对排序的任何影响(对于重复键)。此外,您不必使用
fst3
,通常会以嵌套方式排列数据,因此可以使用普通的
fst