gpt4 book ai didi

string - 我将如何在 haskell 中的空格后拆分字符串?

转载 作者:行者123 更新时间:2023-12-02 00:26:51 25 4
gpt4 key购买 nike

我知道 Haskell 没有循环,所以我不能那样做。我也知道递归在这里“有用”,但这就是我所知道的全部。到目前为止,我已经得到了一个基本的类型签名,它是

toSplit :: String -> [String]

基本上,它从一个字符串变成一个单词列表...

谢谢!

附言我想使用 takeWhiledropWhile 函数...不是库...

最佳答案

如果您想自己实现它,您需要做的第一件事就是找到第一个词。你可以这样做:

takeWhile (/=' ') s

如果字符串以定界字符开头,您需要先修剪它们。我们可以使用 dropWhile 来做到这一点。

takeWhile (/=' ') $ dropWhile (==' ') s

现在我们有了第一个单词,但我们还需要从第一个单词开始的字符串的其余部分,我们将对其进行递归。我们可以使用splitAt:

(_, rest) = splitAt (length word) s

然后我们对字符串的 rest 进行递归,并将第一个单词转换为该递归的结果,从而为我们提供所有单词的列表。

并且我们需要定义基本情况,即一旦没有更多字符将终止递归的空字符串的结果。

toSplit :: String -> [String]
toSplit "" = []
toSplit s =
let word = takeWhile (/=' ') $ dropWhile (==' ') s
(_, rest) = splitAt (length word) s
in word : toSplit (dropWhile (==' ') rest)

编辑:上面的代码中有一个错误,它没有正确处理边缘情况。

错误是它在原始 s 上调用 splitAt 但如果 s 有前导空格,这会给出错误的结果:

*Main> toSplit " foo"
["foo","o"]

这应该可以修复错误:

let trimmed = dropWhile (==' ') s
word = takeWhile (/=' ') trimmed
(_, rest) = splitAt (length word) trimmed

这还剩下一个边缘情况:

*Main> toSplit " "
[""]

一种可能的解决方案是使用辅助函数:

toSplit :: String -> [String]
toSplit = splitWords . dropWhile (==' ')
where
splitWords "" = []
splitWords s =
let word = takeWhile (/=' ') s
(_, rest) = splitAt (length word) s
in word : splitWords (dropWhile (==' ') rest)

关于string - 我将如何在 haskell 中的空格后拆分字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53461230/

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