string - 将字符串拆分为 Clean 中的字符串列表

标签 string split functional-programming clean-language

由于资源有限,我需要在这里提出一个问题。我一直在函数式编程方面苦苦挣扎,无休止的 Haskell 教程并不能真正帮助我。所以我想用 Clean 语言实现的是将 "car cow cat " 这样的字符串拆分为字符串列表 ["car","cow","cat"] 。您能否为我提供详细的答案(不一定是完整的代码),关于如何迭代此字符串,特别是新构造的字符串添加到列表中的部分?

最佳答案

我将提供一个简单的解决方案。在 Haskell 中有无数更好的方法可以做到这一点,但对于函数式编程的新手来说,这是我能想到的最简单的方法,无需使用任何特定的 Haskell 函数,如 takeWhile,甚至任何折叠和映射......

您基本上想模拟列表上的迭代,所以这是我的建议:

  1. 定义一个函数,该函数将采用字符串和分割字符。该函数将返回一个字符串列表 - spliton::String -> Char -> [String]

  2. 要在列表上移动,我们需要吞噬字符,直到遇到一个 split 字符。我们还想保存到目前为止保存的单词以及整个单词列表。 为此,我们将定义一个子函数来保存状态

    spliton'::String -> Char -> String -> [String] -> [String]

    spliton'[]_sofar res = res++ [sofar]

    我还包含了最简单的子句 - 一个空字符串。当字符串为空时,我们只想返回到目前为止保存的内容。

  3. 现在让我们继续讨论实际的递归函数: 如果我们点击分割字符,我们会将迄今为止保存的字符串添加到列表中,并以空的当前状态字符串重新启动 如果我们没有命中分割字符,我们将把该字符添加到当前状态字符串

    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/

相关文章:

c++ - 十六进制字符串到十六进制字符[]

java - 如何匹配特定格式的字符串?

Mysql拆分字符串并选择结果

python - 如何使用正则表达式在非数字之前拆分句点?

javascript - 原型(prototype)、数组扩展和对象属性

Scala:Function0 与按名称参数

Scala 元组函数组合

c - 二维字符串数组

c - 不错的 C 字符串库

sql-server - 在SQL Server 2012中将字符串拆分为一行