gpt4 book ai didi

haskell - 如何正确地将 IO 添加到 attoparsec Parser?

转载 作者:行者123 更新时间:2023-12-04 13:35:04 24 4
gpt4 key购买 nike

我想在我的 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 Action ,我必须做什么?

最佳答案

如果您使用过 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"]

当评估相关值(这里是表达式 stuff++ ... 的结果)时,将打印消息。

关于haskell - 如何正确地将 IO 添加到 attoparsec Parser?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10089808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com