Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/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
使用Sort Haskell对成对的列表进行排序_Haskell - Fatal编程技术网

使用Sort Haskell对成对的列表进行排序

使用Sort Haskell对成对的列表进行排序,haskell,Haskell,我有一个函数(频率),它计算列表中每个不同值在该列表中出现的次数。比如说, frequency "ababca" 应返回: [(3, 'a'), (2, 'b'), (1, 'c')]. 这很好,但是现在我需要使用这个函数使用列表中的第一个元素对列表进行排序 results :: [Party ] -> [(Int, Party)] results xs = ??? frequency (sort xs) ??? 期望输出的示例: [(1, "Green"), (2, "R

我有一个函数(频率),它计算列表中每个不同值在该列表中出现的次数。比如说,

frequency "ababca" 
应返回:

[(3, 'a'), (2, 'b'), (1, 'c')].
这很好,但是现在我需要使用这个函数使用列表中的第一个元素对列表进行排序

results   :: [Party ] -> [(Int, Party)]
results  xs = ??? frequency (sort xs) ??? 
期望输出的示例:

[(1, "Green"), (2, "Red"), (3, "Blue")]
以上都不行,我不知道我能做什么

使用常规“排序”

先谢谢你

import Data.Function (on)
import Data.List (sortBy)

results xs = sortBy (compare `on` fst) (frequency xs)

-- or, if you prefer
results xs = sort (frequency xs)
指向、、的文档的链接


不同之处在于,
sort
按每对元素的第一个元素的升序排序,打破与第二个元素的联系,而
sortBy(compare`on`fst)
只显式查看每对元素的第一个元素。

如果您只能使用
sort
而不能使用
sortBy
(出于某种原因!)然后您需要确保项的类型是
Ord
的实例。如果元组中的所有位置也有
Ord
实例,那么所有元组(大小不超过15个)都有
Ord
实例

您给出的
(1,“绿色”),(2,“红色”),(3,“蓝色”)]
的示例应该可以很好地排序(尽管颠倒了),因为
Int
String
都有
Ord
实例

但是,在代码片段中,您还提到了一个
参与方
类型,但没有实际说明它是什么。如果它不仅仅是字符串之类的别名,您可能需要为它定义一个
Ord
实例,以满足元组的内置Ord实例

您可以让Haskell在声明类型时使用
派生
为您创建实例

 data Party = P1 | P2 | P3 | P4 -- e.g.
     deriving (Eq,Ord)
或者自己申报:

 instance Ord Party where
     -- you don't care about the ordering of the party values
     compare a b = EQ   

但是,正如dave4420所说,只使用
sortBy
要好得多,所以我会这样做,除非您有特定的理由不这样做(即这是一个带有限制的类赋值)。

注意,Haskell使用逗号时,您使用的是分号。我如何使用常规的“sort”来执行上述操作?您可以使用
(比较fst)
而不是
(比较'on`fst)