Haskell - 合并文件夹和复制?

标签 haskell fold

现在我知道如何使用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

这里我们将 ax 识别,将 bprintLine xs 识别,所以 go 变为:

go a b = ('+' : replicate a '-') ++ b

关于Haskell - 合并文件夹和复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31881268/

相关文章:

haskell - 列表推导式中是否创建了任何中间数据结构

haskell - 使用镜头功能更新任意嵌套的数据结构

haskell - 从 ErrorT 转换到 exceptT

haskell - fmap 的参数太多

haskell - 在 Macos 终端上输出 UTF-8 字符串

haskell - 为什么 sum == foldl1 (+) 不是?

bash - 在 bash 上垂直翻转多个字符串

用 Haskell 解析形式逻辑

function - 函数的多个参数

代数数据类型的 Haskell 映射函数