让我们看看代码片段:
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
我认为上述解析器的行为方式应该相同。为什么会出现这个错误?
编辑
上面的例子非常简单(为了简化问题),如下所述,这里没有必要使用 do 表示法,但我希望它使用的真实情况如下:
pSegmentBegin p i = do
j <- pIndentAtLast i
(:) <$> p j <*> ((pEOL *> pSegments p j) <|> pure [])
我注意到在 do 语句之前添加“addLength 1”可以解决问题,但我不确定它是否是正确的解决方案:
pSegmentBegin p i = addLength 2 $ do
j <- pIndentAtLast i
(:) <$> p j <*> ((pEOL *> pSegments p j) <|> pure [])