Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何在manyAccum解析器期间触发错误_Haskell_Parsec_Parser Combinators - Fatal编程技术网

Haskell 如何在manyAccum解析器期间触发错误

Haskell 如何在manyAccum解析器期间触发错误,haskell,parsec,parser-combinators,Haskell,Parsec,Parser Combinators,我想编写一个Parsec解析器,它将解析一个数字序列,返回一个排序列表,但在遇到重复的数字时失败(错误应该指向重复的位置)。对于已排序的部分,我可以简单地使用: manySorted = manyAccum insert 但是,如果该数字已经在列表中,如何触发Parsec错误呢。manyAccum似乎不允许这样做,我也不知道如何制作我自己的manyAccum克隆(实现使用的是未暴露在Parsec库之外的unParser)。如果您确定希望解析器这样做,您可以使用带有错误消息的fail方法退出解析

我想编写一个Parsec解析器,它将解析一个数字序列,返回一个排序列表,但在遇到重复的数字时失败(错误应该指向重复的位置)。对于已排序的部分,我可以简单地使用:

manySorted = manyAccum insert

但是,如果该数字已经在列表中,如何触发Parsec错误呢。manyAccum似乎不允许这样做,我也不知道如何制作我自己的manyAccum克隆(实现使用的是未暴露在Parsec库之外的unParser)。

如果您确定希望解析器这样做,您可以使用带有错误消息的
fail
方法退出解析器。(填写错误位置,并尝试其他可能性,等等。)

您可以通过

sourcePos :: Monad m => ParsecT s u m SourcePos
sourcePos = statePos `liftM` getParserState

然后将这些位置与解析的值一起累加,以便报告原始位置。

您确定这是解析器的工作吗?通常,这种类型的行为会出现在流程的不同部分。请尝试首先解析所有数字,然后检查所有必要的条件。通过这种方式,您可以轻松地抛出异常或返回
Left
,例如。这就是我现在正在做的,但是如果能在错误消息中找到重复项的位置就好了。我猜数字解析器可以从解析器状态中获取位置,并将其与结果一起返回,以便稍后用于错误。这种模式适合这种情况吗?