我有
stringparse = mstring
<$> char '"'
<*> (many alphaNum <|> many space)
<*> char '"'
where mstring a b c = [a] ++ b ++ [c]
当我这样做时,
parse stringparse "" "\"hello\"
我得到Right "\"hello\""
当我这样做时,
parse stringparse "" "\"\""
我得到Right "\"\""
但是当我这样做时,
parse stringparse "" "\" \""
或parse stringparse "" "\"he llo\""
它不起作用。
我收到错误,
Left (line 1, column 2):
unexpected " "
expecting letter or digit or "\""
和
Left (line 1, column 4):
unexpected " "
expecting letter or digit or "\""
分别
我不明白为什么代码不能正确解析空格。
答案 0 :(得分:10)
这是因为你正在做这个many alphaNum <|> many space
。 many
接受0作为可接受的字符数量,它总是成功。这与正则表达式中的*
行为相同。
所以在一个<|>
中,它永远不会失败并呼叫右侧。所以你说“尝试尽可能多alphaNum
,然后选择"
。
你想要的是
many (alphaNum <|> space)
换句话说,“尽可能多alphaNum
或space
”。