在参数中使用解析器并尝试将其应用零次或多次
Taking a parser in argument and try to apply it zero or more times
我目前正在编写一个基本的解析器。 a
类型的解析器在参数中接受一个字符串,returns 要么什么都不做,要么是一个 a
类型的对象和字符串的其余部分。
这是一个满足所有这些特征的简单类型:
type Parser a = String -> Maybe (a, String)
例如,我写了一个函数,它接受一个 Char
作为参数并且 returns 一个 Parser Char
:
parseChar :: Char -> Parser Char
parseChar _ [] = Nothing
parseChar c (x:xs)
| c == x = Just (x, xs)
| otherwise = Nothing
我想编写一个函数,它在参数中接受解析器并尝试应用它零次或多次,返回已解析元素的列表:
parse :: Parser a -> Parser [a]
用法示例:
> parse (parseChar ' ') " foobar"
Just (" ", "foobar")
我尝试编写一个递归函数,但无法将已解析的元素保存在列表中。
如何多次应用解析并将结果保存在列表中?
I tried to write a recursive function but I can't save the parsed elements in a list.
您不需要“保存”任何东西。您可以使用模式匹配。这是一个提示。尝试推理以下每种情况下应该发生什么。中间的情况有点微妙,如果你一开始就弄错了,不要担心。请注意下面如何使用 s
和 s'
。
parse :: Parser a -> Parser [a]
parse p s = case p s of
Nothing -> ... -- first p failed
Just (x,s') -> case parse p s' of
Nothing -> ... -- subtle case, might not be relevant after all
Just (xs,s'') -> ... -- merge the results
另一个提示:请注意,根据您的描述 parse p
应该永远不会失败,因为它总是可以 return 空列表。
我目前正在编写一个基本的解析器。 a
类型的解析器在参数中接受一个字符串,returns 要么什么都不做,要么是一个 a
类型的对象和字符串的其余部分。
这是一个满足所有这些特征的简单类型:
type Parser a = String -> Maybe (a, String)
例如,我写了一个函数,它接受一个 Char
作为参数并且 returns 一个 Parser Char
:
parseChar :: Char -> Parser Char
parseChar _ [] = Nothing
parseChar c (x:xs)
| c == x = Just (x, xs)
| otherwise = Nothing
我想编写一个函数,它在参数中接受解析器并尝试应用它零次或多次,返回已解析元素的列表:
parse :: Parser a -> Parser [a]
用法示例:
> parse (parseChar ' ') " foobar"
Just (" ", "foobar")
我尝试编写一个递归函数,但无法将已解析的元素保存在列表中。
如何多次应用解析并将结果保存在列表中?
I tried to write a recursive function but I can't save the parsed elements in a list.
您不需要“保存”任何东西。您可以使用模式匹配。这是一个提示。尝试推理以下每种情况下应该发生什么。中间的情况有点微妙,如果你一开始就弄错了,不要担心。请注意下面如何使用 s
和 s'
。
parse :: Parser a -> Parser [a]
parse p s = case p s of
Nothing -> ... -- first p failed
Just (x,s') -> case parse p s' of
Nothing -> ... -- subtle case, might not be relevant after all
Just (xs,s'') -> ... -- merge the results
另一个提示:请注意,根据您的描述 parse p
应该永远不会失败,因为它总是可以 return 空列表。