【问题标题】:How can I add n whitespaces after a string with recursion in Haskell?如何在 Haskell 中使用递归的字符串后添加 n 个空格?
【发布时间】:2021-02-07 10:14:52
【问题描述】:

例如,给出一个数字 (5) 和一个字符串 (apple),然后程序会删除 (apple_____)。 我想用递归来做到这一点。我试过这样:

add :: Integer -> [Char] -> [Char]
add 0 (x:xs) = (x:xs)
add i [] = add (i-1) [] ++ " "
add i (x:xs) = format (i-1) xs

【问题讨论】:

  • 你为什么用add i (x:xs) = format (i-1) xs
  • Haskell 初学者没有普遍理解的东西:列表运算符++ 必须通过复制它的左侧操作数来完成它的工作;例如解释here。因此,通过在列表的 end 重复附加一个额外的项目来构建列表或字符串,如上面的代码中所做的那样,恰好是二次低效的。根本原因是 Haskell 列表/字符串是不可变的。请注意,下面威廉的答案中的代码设法完全避免使用运算符++

标签: string haskell recursion add


【解决方案1】:

如果你想添加0空格,你可以返回给定的字符串(1);如果字符串非空,则发出字符串x 的第一个元素并在字符串的尾部递归(2);最后,如果我们到达字符串的末尾,并且i 大于0,我们发出一个空格,并以i 递归,比给定的i 小一个(3):

add :: Integer -> String -> String
add i xs | i <= 0 = xs  -- (1)
add i (x:xs) = x : …    -- (2)
add i [] = ' ' : …      -- (3)

你这里还是要填写部分。

【讨论】:

    猜你喜欢
    • 2022-12-09
    • 2014-01-02
    • 1970-01-01
    • 2014-04-17
    • 2019-04-26
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    相关资源
    最近更新 更多