ReadP между возвратом пустого результата - PullRequest
2 голосов
/ 16 марта 2019

Рассмотрим следующий фрагмент кода, используя ReadP:

import Text.ParserCombinators.ReadP

readP_to_S (between (char '[') (char ']') (munch (/= ','))) "[234]"

Он выводит

[]

Согласно документации,

между :: ReadP open -> ReadP close -> ReadP a -> ReadP a Source #

между открытым закрытием p разбирает открытое, затем p и, наконец, закрытие.Возвращается только значение p.

Следовательно, я ожидаю, что возвращаемое значение будет

[("234", "")]

, так как первый анализатор соответствует открывающей скобке, а второй -закрывающая скобка, а последняя соответствует всему, кроме запятой.Почему это не так?

1 Ответ

1 голос
/ 16 марта 2019

Глядя на источник

between open close p = do _ <- open
                          x <- p
                          _ <- close
                          return x

, кажется очевидным, что парсер p не должен использовать символы, необходимые для парсера close (который, на мой взгляд, былне очень интуитивно понятно).

Это, например,

readP_to_S (between (char '[') (char ']') (munch (/= ']'))) "[234]"

дает

[("234","")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...