【发布时间】:2020-04-29 07:22:21
【问题描述】:
Real World Haskell, chapter 4, page 98 of the print 询问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
显然这种解决方案是错误的,因为输入字符串中的前导空格会导致输出字符串列表中出现一个前导空字符串。
在上面的链接中,我为其他读者研究了几个建议的解决方案,其中许多与我的解决方案类似,但它们通常“后处理”折叠的输出,例如通过 @ 987654328@ing 如果有一个空的前导字符串。
其他方法使用元组(实际上只是对),因此折叠处理对并且可以很好地处理前导/尾随空格。
在所有这些方法中,foldr(或另一种折叠,fwiw)并不是提供开箱即用的最终输出的函数;总是有其他的东西必须以某种方式调整输出。
因此,我回到最初的问题,询问是否真的可以使用折叠来实现words(以正确处理尾随/前导/重复空格的方式)。 使用折叠我的意思是折叠功能必须是最外层的功能:
myWords :: String -> [String]
myWords input = foldr step seed input
【问题讨论】:
标签: haskell functional-programming fold