现在我知道如何使用foldr,我通常会在脑海中编写递归函数,例如当我看到:
sum xs = foldr (+) 0 xs
我的想法是:
sum [] = 0
sum (x:xs) = x + sum xs
据我所知,这基本上就是foldr 的意思。
现在,我有这个代码:
printLine :: [Int] -> String
printLine [] = "+"
printLine (x:xs) = '+' : replicate x '-' ++ printLine xs
它的作用是,以 [5,4] 为例,然后打印“+-----+----+”。现在,我真的很想知道如何使用foldr 来编写这个。它遵循递归函数的一般思想,所以我认为它应该是可行的。我尝试过 lambda 函数和翻转复制恶作剧,但似乎没有任何效果。有什么建议吗?
最佳答案
试试这个:
withFoldr :: [Int] -> String
withFoldr xs = foldr go "+" xs
where go x b = ('+' : replicate x '-') ++ b
一般来说,当你有一个表达式时
f as = foldr go a bs
那么a
等于f[]
。 go
函数具有签名 go::a -> b -> b
对应于 printLine
的递归情况:
-- match up with go :: a -> b -> b
printLine (x:xs) = '+' : replicate x '-' ++ printLine xs
这里我们将 a
与 x
识别,将 b
与 printLine xs
识别,所以 go
变为:
go a b = ('+' : replicate a '-') ++ b
关于Haskell - 合并文件夹和复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31881268/