由于资源有限,我需要提出一个问题here。我一直在函数式编程方面苦苦挣扎,无休止的 Haskell 教程并不能真正帮助我。所以我想要实现的,用 Clean 语言,就是分割一个字符串,比如" car cow cat "
到字符串列表["car","cow","cat"]
。您能否为我提供详细的答案(不一定是完整的代码),说明如何迭代此字符串,特别是新构造的字符串添加到列表中的部分?
我将提供一个简单的解决方案。在 Haskell 中有无数更好的方法可以做到这一点,但对于函数式编程的新手来说,这是我能想到的最简单的方法,无需使用任何特定的 Haskell 函数,如 takeWhile,甚至任何折叠和映射......
您基本上想模拟列表上的迭代,所以这是我的建议:
定义一个函数,它将接受一个字符串和一个分隔符。该函数将返回一个字符串列表 -spliton :: String -> Char -> [String]
-
为了在列表上移动,我们需要吞噬字符,直到遇到一个分裂字符。我们还需要保存到目前为止保存的单词以及整个单词列表。
为此,我们将定义一个子函数来保存状态
spliton' :: String -> Char -> String -> [String] -> [String]
spliton' [] _ sofar res = res ++ [sofar]
我还包含了最简单的子句 - 一个空字符串。当我们的字符串为空时,我们只想返回到目前为止保存的内容。
-
现在让我们继续讨论实际的递归函数:
如果我们点击分割字符,我们会将迄今为止保存的字符串添加到列表中,并以空的当前状态字符串重新启动
如果我们没有命中分割字符,我们会将字符添加到当前状态字符串中
spliton' (currchar:rest) splitby sofar res
| currchar==splitby = spliton' rest splitby "" (res++[sofar])
| otherwise = spliton' rest splitby (sofar++[currchar]) res
所以,总结一下我们的代码:
spliton :: String -> Char -> [String]
spliton source splitchar = spliton' source splitchar [] []
spliton' :: String -> Char -> String -> [String] -> [String]
spliton' [] _ sofar res = res ++ [sofar]
spliton' (currchar:rest) splitby sofar res
| currchar==splitby = spliton' rest splitby "" (res++[sofar])
| otherwise = spliton' rest splitby (sofar++[currchar]) res
注意:但这不会消除空字符串 - 这意味着如果您有许多多余的空格 - 您会将它们添加到列表中。我会让您思考如何处理这种情况 - 希望这可以帮助您开始。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)