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 を受け入れ、常に成功します。これは正規表現と同じ動作*です。

したがって、 a<|>では、失敗して右側を呼び出すことは決してありません。alphaNumつまり、「できるだけ多く試してから".

あなたが欲しいのは

many (alphaNum <|> space) 

言い換えれば、「可能な限り多くalphaNumの s またはspaces」です。

于 2013-09-13T02:52:48.150 に答える