haskell 使用endOfInput分析器的输入不完整

c2e8gylq  于 2023-02-13  发布在  其他
关注(0)|答案(1)|浏览(163)

考虑字符串"(=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(如第一个示例)。

plicqrtu

plicqrtu1#

要得到完整的答案,需要提供一个生成Result: incomplete input错误消息的完全独立的示例,但您的Attoparsec解析器工作正常,您可以通过一个简单得多的示例看到类似的行为:

λ> parse (char 'e') "e"
Done "" 'e'
λ> parse endOfInput ""
Partial _

Attoparsec解析器在设计上允许增量提供附加输入。当它们在一些(可能是部分)输入上运行时,如果解析器在提供的输入上无条件成功,则它们返回Done结果。如果需要更多输入来确定解析器是否成功,则它们返回Partial结果。
对于我上面的例子,char 'e'总是成功地解析部分输入"e",无论您决定提供什么附加输入,因此结果是Done
然而,endOfInput * 可能 * 在部分输入""上成功,但只有在没有提供额外输入的情况下。如果有额外输入,endOfInput将失败。因此,返回Partial结果。
这个例子也是一样的,第二个解析器的成功取决于是否提供了额外的输入,如果没有额外的输入,解析器就是Done,但是如果有额外的输入,解析器就有更多的工作要做。
您需要安排使用parseOnly运行解析器:

λ> parseOnly (manyTill anyChar endOfInput) "foo"
Right "foo"

或者你会feed你的解析结果一个空字节串,这将表明没有进一步的输入可用:

λ> parse (manyTill anyChar endOfInput) "foo"
Partial _
λ> feed (parse (manyTill anyChar endOfInput) "foo") ""
Done "" "foo"

相关问题