2011-05-30 88 views
1

这是99个Haskell问题中的第10个问题:运行长度编码代码问题

(*)列表的运行长度编码。使用问题P09的结果来实现所谓的游程编码数据压缩方法。元件的连续的重复编码为列表(NE),其中N是元件E.

实施例的复制品在Haskell数: encode "aaaabccaadeeee" - >[(4,'a'),(1,'b'),(2,'c'),(2,'a'),(1,'d'),(4,'e')]

这是我的代码:

import Data.List 
encode :: [a] -> [(Int,a)] 
encode = map (\ws -> (length ws, head ws)) . group 

这是我得到的错误:

No instance for (Eq a) 
arising from a use of `group' 
In the second argument of `(.)', namely `group' 
In the expression: map (\ ws -> (length ws, head ws)) . group 
In an equation for `encode': 
    encode = map (\ ws -> (length ws, head ws)) . group 

我不明白这有什么错用组,如果我将函数的类型更改为String -> [(Int, Char)],它将贯穿始终。

我该如何解决这个问题?

回答

6

要使用group函数,您需要承诺您将传递一个可以使用==的项目的列表,即Eq类型类的成员。如果你省略了类型,或者你指定了一个类型,它是Eq的成员,它将起作用;如果你想成为更普遍的,你需要保证它,你正在使用的东西是在Eq

encode :: Eq a => [a] -> [(Int,a)] 
encode = map (\ws -> (length ws, head ws)) . group 

(在现实中,这是经过实施Eqa作为一个隐藏的参数,所以group将知道使用哪个(==);与功能参数的相似性是故意的。)

+0

函数组具有类型签名Eq a => [[a]] - > [a]。它根据元素是否相等将a列表并将它们组合在一起(生成a的列表)。要做到这一点,类型a需要是类Eq的一个实例。 – 2011-05-30 02:12:25