Позволяет увидеть фрагмент кода:Не удается вычислить минимальную длину парсер - УУ-parsinglib в Haskell
pSegmentBegin p i = pIndentExact i *> ((:) <$> p i <*> ((pEOL *> pSegment p i) <|> pure []))
, если я изменю этот код в моем парсер:
pSegmentBegin p i = do
pIndentExact i
((:) <$> p i <*> ((pEOL *> pSegment p i) <|> pure []))
У меня есть ошибка:
canot compute minmal length of a parser due to occurrence of a moadic bind, use addLength to override
Я думал, что приведенный выше парсер должен вести себя одинаково. Почему эта ошибка может возникнуть?
EDIT
Приведенный выше пример является очень простой (для упрощения вопроса) и, как указано ниже, это не обязательно использовать делать обозначения здесь, но реальный случай, я хотел, чтобы использовать следующим образом:
pSegmentBegin p i = do
j <- pIndentAtLast i
(:) <$> p j <*> ((pEOL *> pSegments p j) <|> pure [])
Я заметил, что добавление «addLength 1» до того, как сделать заявление, решает эту проблему, но я не уверен, если его правильное решение:
pSegmentBegin p i = addLength 2 $ do
j <- pIndentAtLast i
(:) <$> p j <*> ((pEOL *> pSegments p j) <|> pure [])
Спасибо! Он многое разъясняет. Я думаю, что в моем случае я должен использовать комбинатор синтаксического анализатора ('pSegmentBegin' потребляет пробелы, подсчитывает новый уровень отступа, а затем заставляет все строки ниже использовать этот отступ), поэтому его невозможно записать в« чистой аппликативной "style –
В соответствии с вашим вопросом о' StackOverflow' - я не знаю, есть ли какие-либо вопросы подписки доступны - если есть я havent использовал его до сих пор, но я думаю, размещение вопросов здесь очень хорошая идея - когда я искал что-нибудь о 'uu-parsinglib' - единственные результаты, которые я нашел, были на' StackOverflow' и еще много программистов, это намного больше, чем любой список рассылки. –
Привет @ Doaitse! Вы можете получать уведомления по электронной почте обо всех будущих SO-вопросах, которые включают тег [tag: uu-parsinglib], зависая над тегом и нажав «Подписаться». Я отредактирую ваш вопрос, чтобы очистить ненужные точки и заострить перфоманс :) Все самое лучшее. – ulidtko