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)]