《真实世界》 Haskell,印刷版的第98页第4章询问是否words
可以使用折叠实现,这也是我的问题:
可能吗?如果没有,为什么?如果是,怎么办?
我基于以下想法提出了以下想法:每个非空格都应该放在输出列表中的最后一个单词之前(这发生在otherwise
防护中),并且空格应该触发将空值单词附加到输出列表,如果没有一个已经(这是在处理if
- - )。then
else
myWords :: String -> [String]
myWords = foldr step [[]]
where
step x yss@(y:ys)
| x == ' ' = if y == "" then yss else "":yss
| otherwise = (x:y):ys
显然,此解决方案是错误的,因为输入字符串中的前导空格会导致输出字符串列表中的一个前导空字符串。
在上面的链接中,我研究了为其他读者准备的几种解决方案,其中许多解决方案与我的解决方案相似,但是它们通常对折页的输出进行“后处理”,例如通过折叠tail
处理是一个空的前导字符串。
其他方法使用元组(实际上仅是成对的),以便对折处理成对的并可以很好地处理前导/尾随空间。
在所有这些方法中,foldr
(或另一种折衷方式)并不是开箱即用地提供最终输出的功能。总有其他东西必须以某种方式调整输出。
因此,我回到最初的问题,询问是否实际上可以words
使用折叠实现(以某种方式正确处理尾随/前导/重复的空格)。通过使用折叠,我的意思是折叠功能必须是最外面的功能:
myWords :: String -> [String]
myWords input = foldr step seed input