考虑字符串"(=x250) toto e"
和函数:
charToText :: Char -> Text
charToText c = pack [c]
成功解析字符串的用户:
mconcat <$> manyTill (charToText <$> anyChar) (char 'e')
具有预期结果"(=x250) toto "
。
但是,解析器:
mconcat <$> manyTill (charToText <$> anyChar) endOfInput
返回Partial _
。
为什么会这样呢?我以为endOfInput
会在字符串末尾成功并停止manyTill
(如第一个示例)。
1条答案
按热度按时间plicqrtu1#
要得到完整的答案,需要提供一个生成
Result: incomplete input
错误消息的完全独立的示例,但您的Attoparsec解析器工作正常,您可以通过一个简单得多的示例看到类似的行为:Attoparsec解析器在设计上允许增量提供附加输入。当它们在一些(可能是部分)输入上运行时,如果解析器在提供的输入上无条件成功,则它们返回
Done
结果。如果需要更多输入来确定解析器是否成功,则它们返回Partial
结果。对于我上面的例子,
char 'e'
总是成功地解析部分输入"e"
,无论您决定提供什么附加输入,因此结果是Done
。然而,
endOfInput
* 可能 * 在部分输入""
上成功,但只有在没有提供额外输入的情况下。如果有额外输入,endOfInput
将失败。因此,返回Partial
结果。这个例子也是一样的,第二个解析器的成功取决于是否提供了额外的输入,如果没有额外的输入,解析器就是
Done
,但是如果有额外的输入,解析器就有更多的工作要做。您需要安排使用
parseOnly
运行解析器:或者你会
feed
你的解析结果一个空字节串,这将表明没有进一步的输入可用: