- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于资源有限,我需要在这里提出一个问题。我一直在函数式编程方面苦苦挣扎,无休止的 Haskell 教程并不能真正帮助我。所以我想用 Clean 语言实现的是将 "car cow cat "
这样的字符串拆分为字符串列表 ["car","cow","cat"]
。您能否为我提供详细的答案(不一定是完整的代码),关于如何迭代此字符串,特别是新构造的字符串添加到列表中的部分?
最佳答案
我将提供一个简单的解决方案。在 Haskell 中有无数更好的方法可以做到这一点,但对于函数式编程的新手来说,这是我能想到的最简单的方法,无需使用任何特定的 Haskell 函数,如 takeWhile,甚至任何折叠和映射......
您基本上想模拟列表上的迭代,所以这是我的建议:
定义一个函数,该函数将采用字符串和分割字符。该函数将返回一个字符串列表 - spliton::String -> Char -> [String]
要在列表上移动,我们需要吞噬字符,直到遇到一个 split 字符。我们还想保存到目前为止保存的单词以及整个单词列表。为此,我们将定义一个子函数来保存状态
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
注意:但这不会消除空字符串 - 这意味着如果您有许多多余的空格 - 您会将它们添加到列表中。我会让您思考如何处理这种情况 - 希望这可以帮助您开始。
关于string - 将字符串拆分为 Clean 中的字符串列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26357128/
我是一名优秀的程序员,十分优秀!