コード スニペットを見てみましょう。
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 [])