3

attoparsec パーサーでトレース/デバッグを行いたいと考えています。これは最小限の[ない]動作例です:

import Data.Text as T
import Data.Attoparsec.Text
import Data.Attoparsec.Combinator
import Control.Applicative ((<*), (*>))

parseSentences :: Parser [T.Text]
parseSentences = many1 $ takeWhile1 (/= '.') <* char '.' <* skipSpace

parser :: Parser [T.Text] 
parser = do
    stuff <- parseSentences
--    putStrLn $ "Got stuff: " ++ show stuff

    tail <- takeText
--    putStrLn $ "Got tail: " ++ show tail

    return $ stuff ++ [tail, T.pack "more stuff"]

main = do
    let input = T.pack "sample. example. bang"
    print $ parseOnly parser input

パーサーで IO アクションを使用するにはどうすればよいですか?

4

1 に答える 1

5

Parsec ライブラリを使用していた場合、コード内で IO とパーサー コマンドを混合するために Parsec モナド トランスフォーマーを使用する可能性があったでしょう。

ただし、Attoparsec は純粋なパーサーであるため、Debug.Trace.trace関数を使用して、デバッグ目的でターミナルにメッセージを出力する必要があります。

parser = do
  stuff <- parseSentences
  tail <- takeText
  return .
    trace ("Got stuff: " + show stuff) .
    trace ("Got tail: "  + show tail) $
    stuff ++ [tail, T.pack "more stuff"]

関連付けられた値 (ここでは式の結果stuff ++ ...) が評価されると、メッセージが出力されます。

于 2012-04-10T14:15:04.820 に答える