Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.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
List Haskell游程编码函数_List_Haskell_Encoding_Integer_Tuples - Fatal编程技术网

List Haskell游程编码函数

List Haskell游程编码函数,list,haskell,encoding,integer,tuples,List,Haskell,Encoding,Integer,Tuples,此编码函数需要以下输出:, code“aaccbbaa”=[('a',2),('c',2),('b',2),('a',2) 然而,这是我的输出。 code“aaccbbaa”=[('a',4),('c',2),('b',2)] 这是我的功能 code :: Eq a => [a] -> [(a,Int)] code [] = [] code (x:xs) = [(x, length(filter(==x)(x:xs)))] ++ code(filter (/=x)(xs)) 如何使

此编码函数需要以下输出:,
code“aaccbbaa”=[('a',2),('c',2),('b',2),('a',2)

然而,这是我的输出。
code“aaccbbaa”=[('a',4),('c',2),('b',2)]

这是我的功能

code :: Eq a => [a] -> [(a,Int)]
code [] = []
code (x:xs) = [(x, length(filter(==x)(x:xs)))] ++ code(filter (/=x)(xs))

如何使其重新计算下一个字母出现的时间?

A
foldr
带有助手功能,应足以处理此作业,如下所示:

code :: Char -> [(Char,Int)] -> [(Char,Int)]
code c [(_,0)]    = [(c,1)]
code c ((x,n):ts) | c == x    = (x,n+1):ts
                  | otherwise = (c,1):(x,n):ts

rle :: String -> [(Char,Int)]
rle = foldr code [(' ',0)]
根据您对接受任何类型的
Eq
类实例的评论,我们可以简化
rle
函数。另一方面,接受的答案涉及3个耗时的操作,如
group
map
length
。对于一次性使用,这并不重要,但是如果您将使用此函数在一些单词或句子上,我会无数次地给出以下建议,这些建议只会在列表中出现一次

rle :: Eq a => [a] -> [(a,Int)]
rle = foldr code []
      where code c []         = [(c,1)]
            code c ((x,n):ts) | c == x    = (x,n+1):ts
                              | otherwise = (c,1):(x,n):ts
Data.List中有一个函数

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


这是非常简洁的编码。我刚刚检查了组函数,
组“aaccbbaa”
输出
[“aa”,“cc”,“bb”,“aa”]
这也可以工作,并且更容易理解。但是它改变了原始的数据结构
代码::Eq a=>[a]->[(a,Int)]
@BCKN你说得对……我已根据你的需要更正了代码。它只需在O(n)时间内通过一次列表即可完成此任务。
λ> code "aaccbbaa"
[('a',2),('c',2),('b',2),('a',2)]