【发布时间】: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