【发布时间】:2021-06-25 20:58:36
【问题描述】:
我想使用 fold 将字符串拆分为给定长度的字符串列表。
split :: n -> String -> [String]
split 4 "abcdefghijklmnopqrst" -> ["abcd","efgh","ijkl","mnop","qrst"]
这可以使用foldr 完成吗?您能否提供一个解释,以便我对如何使用折叠来解决此类问题有一些直觉?
编辑:我添加了递归解决方案
split :: Int -> String -> [String]
split len xs
| len >= length xs = [xs]
| otherwise = take len xs : split len (drop len xs)
【问题讨论】:
-
你尝试了什么,什么不起作用?
-
这种递归函数对于转换为折叠可能不太有用。您需要一个一个地获取列表元素的自然递归。这通常涉及到
[]和x:xs之类的模式匹配。 -
虽然我同意@n.1.8e9-where's-my-sharem.,但我确实认为这种问题是一个很好的练习。
-
框架挑战:为什么你想使用foldr?没有经验丰富的 Haskell 程序员会这样做,即使在他们不只是导入执行此操作的函数的反事实世界中也是如此。
-
@danielwagner 我只是想用 foldr 来做这件事,因为我是 Haskell 的新手,想了解更多折叠的真正工作原理。没有必要使用折叠来做到这一点,因为这是我需要解决一个更大的问题的功能,这是我试图解决的练习的主要目标。我只是好奇使用 foldr 的解决方案是什么。