Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 运行长度编码代码有问题_Haskell - Fatal编程技术网

Haskell 运行长度编码代码有问题

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 -> (

这是哈斯克尔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 -> (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的实例。