gpt4 book ai didi

string - Haskell 语法,为假人解析错误

转载 作者:行者123 更新时间:2023-12-01 09:27:05 25 4
gpt4 key购买 nike

今天我读了很多关于 Haskell 的文章,但是这种格式让我发疯了。我想尽快了解我的基本错误,以便我可以开始正常编码。这里的函数应该返回一个以下一个“数学符号”示例字符串开头的字符串 (2sdwds+asd)+3 应该返回 +asd)+3。 这是代码

getToNextSign :: String -> String 
getToNextSign str = do

let mathSigns = ['+' , '-' , '*' , '/' , '^' , ')']
let a = head str
if a `elem` mathSigns
then str
else if tail str /= []
then getToNextSign $ tail str
else []

main = do
putStrLn $ getToNextSign "(2sdwds+asd)+3"

它给了我“输入 = 解析错误”。我也不确定如何在 main 中准确调用它,我是否真的需要 putStrLn 函数。我不认为我需要它,但我尝试了 2874 种不同的方式来写这个,现在我放弃了,需要帮助。

最佳答案

除了 Stephen Diehl 提供的格式改进之外,您还可以进行其他改进。正如 Carl 指出的那样,您可以将 if-else if-else 替换为 guard ,如下所示:

getToNextSign :: String -> String
getToNextSign str
| a `elem` mathSigns = str
| tail str /= [] = getToNextSign $ tail str
| otherwise = []
where
a = head str
mathSigns = ['+' , '-' , '*' , '/' , '^' , ')']

当你使用它时,你也可以用模式匹配替换头/尾,如

getToNextSign :: String -> String
getToNextSign (c:cs)
| c `elem` mathSigns = c:cs
| not (null cs) = getToNextSign cs
| otherwise = []
where
mathSigns = ['+' , '-' , '*' , '/' , '^' , ')']

如果你要做模式匹配,你也可以一直这样做。

getToNextSign :: String -> String
getToNextSign str = case str of
c:_ | c `elem` mathSigns -> str
c:[] -> []
_:cs -> getToNextSign cs
where mathSigns = ['+' , '-' , '*' , '/' , '^' , ')']

当你这样做时,你会意识到你还没有真正处理 getToNextSign 得到一个空列表作为参数的情况,这可能是你想做的事情。

关于string - Haskell 语法,为假人解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21563428/

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