Haskell 运行长度编码代码有问题
这是哈斯克尔99个问题中的第10个: (*)列表的运行长度编码。使用问题P09的结果来实现所谓的运行长度编码数据压缩方法。元素的连续副本被编码为列表(ne),其中N是元素E的副本数量 哈斯克尔的例子:Haskell 运行长度编码代码有问题,haskell,Haskell,这是哈斯克尔99个问题中的第10个: (*)列表的运行长度编码。使用问题P09的结果来实现所谓的运行长度编码数据压缩方法。元素的连续副本被编码为列表(ne),其中N是元素E的副本数量 哈斯克尔的例子: 编码“aaaabccaadeee”->[(4,'a'),(1,'b'),(2,'c'),(2,'a'),(1,'d'),(4,'e')] 这是我的密码: import Data.List encode :: [a] -> [(Int,a)] encode = map (\ws -> (
编码“aaaabccaadeee”
->[(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
我不明白group的用法有什么问题,如果我将函数类型更改为String->[(Int,Char)]
,它将运行到底
如何解决此问题?要使用
组
功能,您需要保证传递一个可以使用=
的项目列表,也就是说,Eq
类型类的成员。如果省略该类型,或指定了属于Eq
成员的类型,则该类型将起作用;如果你想变得更一般,你需要保证你使用的是Eq
:
encode :: Eq a => [a] -> [(Int,a)]
encode = map (\ws -> (length ws, head ws)) . group
(实际上,这是将
a
的Eq
实现作为隐藏参数传递,因此group
将知道使用哪个(==)
;与函数参数的相似性是经过深思熟虑的。)要使用group
函数,您需要保证传递一个可以使用=
的项目列表,也就是说,Eq
typeclass的成员。如果省略该类型,或指定了属于Eq
成员的类型,则该类型将起作用;如果你想变得更一般,你需要保证你使用的是Eq
:
encode :: Eq a => [a] -> [(Int,a)]
encode = map (\ws -> (length ws, head ws)) . group
(实际上,这是将
a
的Eq
实现作为隐藏参数传递,因此group
将知道使用哪个(==)
;与函数参数的相似性是经过深思熟虑的。)函数组具有类型签名Eq a=>[[a]->[a]。它获取一个a的列表,并根据元素是否相等将它们分组(以生成一个a的列表)。要执行此操作,类型a需要是类型类Eq的实例。函数组具有类型签名Eq a=>[[a]]->[a]。它获取一个a的列表,并根据元素是否相等将它们分组(以生成一个a的列表)。要执行此操作,类型a需要是类型类Eq的实例。