wiz*_*wiz 3 io monads haskell monad-transformers attoparsec
我想在我的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
Run Code Online (Sandbox Code Playgroud)
为了在我的解析器中使用IO操作,我必须做什么?
如果您使用过Parsec库,则可以使用Parsec monad转换器在代码中混合IO和解析器命令.
但是,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"]
Run Code Online (Sandbox Code Playgroud)
当stuff ++ ...评估关联值(此处为表达式的结果)时,将打印消息.