用于对元组列表进行排序的函数 - Haskell

时间:2012-05-01 22:56:11

标签: haskell

很抱歉这个简单的问题,我对haskell来说是个新手......

我正在尝试编写一个函数“order”,它将对另一个函数“frequency”产生的元组列表进行排序(频率计算列表中不同元素的数量a给出一个这样的结果,比如说>频率“ aabbbccc“,将产生结果,[(2,a),(3,b),(3,c)])按升序排列。我无法弄清楚如何写它。

如果我将> sort(频率分数)写入前奏,它将对其进行排序(得分为成绩列表,即[“a”,“b”,“c”,“c”]。

但是当我尝试写一个函数时..

results :: [a] -> [(Int, a)]
results = sort (frequency score)

令人遗憾的是,这种排序适用于太多的论点。

对于明显的问题表示歉心,并提前致谢。

2 个答案:

答案 0 :(得分:8)

你忘了让你的功能参与其中。

results :: [a] -> [(Int, a)]
results score = sort (frequency score)

没有它,编译器会看到你的类型签名,并推断为了返回[a] -> [(Int, a)]类型的东西,sort必须采用另一个参数,而不是。{/ p>

但是,接下来的问题是您无法对具有任意组件类型的元组列表进行排序。请参阅@ luqui的答案,了解如何处理。

答案 1 :(得分:4)

您确定sort申请了太多参数吗?对我来说,看起来你给出了错误的类型签名。这可能很容易:

results :: (Ord a) => [a] -> [(Int, a)]

(即你不能对[(Int, a)]的列表进行排序,除非a是一个Ord类型的类型,即你可以比较元素。)

然而,这个签名并不是真的必要,你也可以sortBy (\x y -> compare (fst x) (fst y)),它有许多惯用的简洁方法,但对于新手我觉得最好是明确的。这种方式不需要比较a,因为它只查看Int s。

编辑:哦,是的,我明白为什么它会说sort应用了太多的参数。见@ hammar的回答。