gpt4 book ai didi

haskell - 是否可以在 Haskell 中嵌套守卫?

转载 作者:行者123 更新时间:2023-12-04 08:57:02 24 4
gpt4 key购买 nike

Haskell新手在这里,试图编写代码来解析数学表达式。
代码:

isDigit :: Char -> Bool
isDigit c = c >= '0' && c <= '9'

parseNumber :: String -> Maybe (String, String)
parseNumber [] = Just ("", "")
parseNumber (h:ls)
| isDigit h
| p == Nothing = Just([h], ls) -- Digit found <<< ERROR!!
| otherwise = Just (h:fst d, snd d) -- Ends in a digit
| h == '.'
| p == Nothing = Nothing -- Ends in a point
| not ('.' `elem` (snd d)) = Just (h:(fst d), snd d) -- We don't want multiple dots
| otherwise = Nothing -- Not a number, stop looking!
where
p = parseNumber ls
Just d = parseNumber ls -- Float version of p. Not used if p is Nothing
这个函数应该接受一个以数字开头的字符串,并返回与表达式的其余部分分开的数字。例子:

parseNumber "123.0 + 2"

("123.0", " + 2")


我认为这个嵌套 guard 的语法读起来非常好,但它不起作用。
对于标记的行,错误显示为:

parse error on input `|'


Haskell中不允许使用链式 guard 吗?还是我以某种方式错误地写了这个?另外,我必须以简单的方式链接逻辑吗?

最佳答案

不,但如果您愿意,可以使用案例:

parseNumber :: String -> Maybe (String, String)
parseNumber [] = Just ("", "")
parseNumber (h:ls)
| isDigit h =
case () of
() | p == Nothing -> Just([h], ls)
| otherwise -> Just (h:fst d, snd d) -- Ends in a digit
| h == '.' =
case () of
() | p == Nothing -> Nothing
| not ('.' `elem` (snd d)) -> Just (h:(fst d), snd d)
| otherwise = Nothing
where
p = parseNumber ls
Just d = parseNumber ls

或者,多路 if 以类似的方式工作 ( if True | p1 -> b ; | p2 -> c)。

关于haskell - 是否可以在 Haskell 中嵌套守卫?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34124558/

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