为什么我收到 Partial 数据类型?

zer*_*ing 1 haskell

我有以下代码片段:

import Control.Applicative
import Data.Text
import Data.Attoparsec.Text

data GreetingYear = GreetingYear Text Int deriving Show


greetingYearParser :: Parser GreetingYear
greetingYearParser = GreetingYear <$> (string "hello" <|> string "bye")  
                                  <*> decimal
Run Code Online (Sandbox Code Playgroud)

当我使用它时,如下所示:

parse greetingYearParser "hello172" 
Run Code Online (Sandbox Code Playgroud)

我有

Partial _
Run Code Online (Sandbox Code Playgroud)

为什么我没有收到:

Done "" (GreetingYear "hello" 172)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Car*_*arl 5

Attoparsec 构建增量解析器。该parse函数并不假设它已获得所有输入,而仅假定其已获得一部分。如果下一个输入块以 开头"32",则解析的 中将包含更多内容decimal。我认为您可能想要parseOnly而不是parse,这会额外假设它已获得完整的剩余输入。

  • 您仍然会得到“部分”,因为“十进制”解析器没有既匹配又不接受更多输入的状态。‘string’解析器是不同的——一旦匹配,它就不再接受更多的输入,所以就完成了。从解析器获得以“decimal”结尾的“Done”结果的唯一方法是告诉解析器输入已完成。这就是“parseOnly”的作用。 (2认同)