Function Folds在Haskell中的实现

Function Folds在Haskell中的实现,function,haskell,functional-programming,refactoring,fold,Function,Haskell,Functional Programming,Refactoring,Fold,我在理解Haskell上的FOLD实现时遇到了很多问题。我需要有两个使用fold的函数,它们有这个输出 > runLengthEncode "aaaaaaabbb" [(7,'a'),(3,'b')] > runLengthDecode [(1,'h'), (5,'i')] "hiiiii" 所以我所做的是首先编写函数,就像我在模式匹配中所做的那样(它们是有效的),但是现在我不知道如何使用左折或右折来“转换” runLengthEncode :: String -> [(In

我在理解Haskell上的FOLD实现时遇到了很多问题。我需要有两个使用fold的函数,它们有这个输出

> runLengthEncode "aaaaaaabbb"
[(7,'a'),(3,'b')]
> runLengthDecode [(1,'h'), (5,'i')]
"hiiiii"
所以我所做的是首先编写函数,就像我在模式匹配中所做的那样(它们是有效的),但是现在我不知道如何使用左折或右折来“转换”

runLengthEncode :: String -> [(Int,Char)]
runLengthEncode [] = []
runLengthEncode (x:xs) = runLengthEncode 1 x xs
    where
        runLengthEncode n x [] = [(n,x)]
        runLengthEncode n x (y:ys) | x == y = runLengthEncode (n + 1) y ys
                                   | otherwise = (n,x) : runLengthEncode 1 y ys

runLengthDecode :: [(Int,Char)] -> String
runLengthDecode [] = []
runLengthDecode ((a,b):xs) = replicate a b ++ (runLengthDecode xs)

将折叠视为一系列术语:

[a,b,c,d]
以及在术语之间添加初始值
zz
和二进制运算符

foldl (<+>) zz [a,b,c,d] = (((zz <+> a) <+> b) <+> c) <+> d
foldr (<+>) zz [a,b,c,d] = a <+> (b <+> (c <+> (d <+> zz)))
对于运算符
和一些初始值
zz

我们可以轻松地“求解”
zz
,因为我们知道
运行lengthcode[]=[]
,所以
zz=[]
。我们需要定义
,使其满足从上述示例(从右到左)导出的方程,如:

再次确定
zz
应该是什么。然后,找出如何编写二进制运算符来求解:

(5, 'i') <+> zz = "iiiii"
(1, 'h') <+> "iiiii" = "hiiiii"

你应该发表你尝试使用折叠的文章,并解释你遇到的问题。欢迎来到SO。如果以下答案之一解决了您的问题,您应该接受它(单击相应答案旁边的复选标记)。这有两件事。它让每个人都知道你的问题已经解决了,并让帮助你的人相信你的帮助。请参阅以获取完整的解释。()您是否有机会查看我在上述评论中提供的链接?通过不接受答案,你可以保持问题的开放性,向社区发出这些问题仍未解决的信号。他们还在吗?如果是,为什么评论中没有后续问题或澄清要求?归纳编程FTW!——“必须检查当前RLE的最后一个元素”最后一个是第一个,只是朝相反的方向看…:)
'b' <+> [] = [(1, 'b')]
'a' <+> [(1, 'b')] = [(1, 'a'), (1, 'b')]
'a' <+> [(1, 'a'), (1, 'b')] = [(2, 'a'), (1, 'b')]
'a' <+> [(2, 'a'), (1, 'b')] = [(3, 'a'), (1, 'b')]
(<+>) :: Char -> [(Int, Char)] -> [(Int, Char)]
x <+> ((n, y) : rest) | x == y = ((n+1), y) : rest
x <+> rest                     = (1, x) : rest
runLengthEncode' :: String -> [(Int,Char)]
runLengthEncode' = foldr (<+>) []
(((zz + 'a') <+> 'a') <+> 'a') <+> 'b' =>  [(3,'a'),(1,'b')]
(1, 'h') <+> ((5, 'i') <+> zz) = "hiiiii"
(5, 'i') <+> zz = "iiiii"
(1, 'h') <+> "iiiii" = "hiiiii"
runLengthEncode'' :: String -> [(Int,Char)]
runLengthEncode'' = foldr step []
  where step x ((n, y) : rest) | x == y = ((n+1), y) : rest
        step x rest                     = (1, x) : rest

runLengthDecode'' :: [(Int,Char)] -> String
runLengthDecode'' = foldr step ""
  where step (n, x) str = replicate n x ++ str