4

我有

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 "\""

分别。

我不明白为什么代码不能正确解析空格。

4

1 回答 1

10

这是因为你正在这样做many alphaNum <|> many spacemany接受 0 作为可接受的字符数量,它总是成功。这与正则表达式中的行为相同*

因此,<|>它永远不会失败并调用右侧。所以你是说“尽可能多地尝试alphaNum然后采取".

你想要的是

many (alphaNum <|> space) 

换句话说,“尽可能多alphaNum的 s 或spaces”。

于 2013-09-13T02:52:48.150 回答