3

对不起,这个简单的问题只是我对haskell非常陌生..

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

如果我在前奏中写入 >sort(频率分数),它将对其进行排序(分数是一个等级列表,即 [“a”,“b”,“c”,“c”]。

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

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

遗憾的是,说排序应用于太多参数是行不通的。

很抱歉这个明显的问题,并在此先感谢。

4

2 回答 2

9

你忘了让你的函数接受一个参数。

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

没有它,编译器会看到您的类型签名并推断出为了返回某种类型的东西[a] -> [(Int, a)]sort必须采用另一个参数,但它没有。

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

于 2012-05-01T23:00:41.490 回答
4

你确定它说sort应用了太多参数吗?对我来说,您似乎给出了错误的类型签名。这可能很容易工作:

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

(即,您不能对[(Int, a)]除非a是具有Ordering 的类型的列表进行排序,也就是说您可以比较元素)。

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

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

于 2012-05-01T23:01:51.730 回答