我有
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 """
分别。
我不明白为什么代码不能正确解析空格。
这是因为你正在做这个many alphaNum <|> many space
. many
接受 0 作为可接受的字符数,则始终成功。这与正则表达式中的*
行为相同。
所以在<|>
它永远不会失败并打电话给正确的一方。所以你说"尝试尽可能多的alphaNum
然后"
。
你想要的是
many (alphaNum <|> space)
换句话说,"尽可能多的alphaNum
或space
"。