使用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)
。