gpt4 book ai didi

Haskell - 按分隔符分割字符串

转载 作者:行者123 更新时间:2023-12-02 16:06:18 24 4
gpt4 key购买 nike

我正在尝试用 Haskell 编写一个程序来按分隔符分割字符串。

我研究了其他用户提供的不同示例。下面发布的代码就是一个示例。

split :: String -> [String]
split [] = [""]
split (c:cs)
| c == ',' = "" : rest
| otherwise = (c : head rest) : tail rest
where
rest = split cs

示例输入:“1,2,3”。示例输出:["1","2","3"]

我一直在尝试修改代码,以便输出类似于 ["1", ",", "2", ",", "3"] 其中包括输出中也有分隔符,但我就是无法成功。

例如,我更改了该行:

   | c == ','  = "" : rest

进入:

   | c == ','  = "," : rest

但结果变成了["1,","2,","3"]

问题是什么?我在哪一部分有误解?

最佳答案

如果您尝试“真正”编写此函数,而不是编写逐字符递归进行练习,我认为更清晰的方法是使用 break来自 Data.List 的函数。表达式如下:

break (==',') str

将字符串分解为元组 (a,b)其中第一部分由初始的“无逗号”部分组成,第二部分是以逗号开头的更多字符串,或者如果没有更多字符串则为空。

这定义了split清晰明了:

split str = case break (==',') str of
(a, ',':b) -> a : split b
(a, "") -> [a]

您可以验证这是否处理 split "" (返回 [""] ),因此无需将其视为特殊情况。

此版本还有一个额外的好处,即包含分隔符的修改也很容易理解:

split2 str = case break (==',') str of
(a, ',':b) -> a : "," : split2 b
(a, "") -> [a]

请注意,我在这些函数中编写的模式的详细程度超出了绝对清楚所发生情况所需的程度,这也意味着 Haskell 对每个逗号进行重复检查。因此,有些人可能更喜欢:

split str = case break (==',') str of
(a, _:b) -> a : split b
(a, _) -> [a]

或者,如果他们仍然想准确记录他们在每个案例分支中所期望的内容:

split str = case break (==',') str of
(a, _comma:b) -> a : split b
(a, _empty) -> [a]

关于Haskell - 按分隔符分割字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46580924/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com