通过遵循https://hackage.haskell.org/package/pipes-attoparsec-0.1.0.1/docs/Control-Proxy-Attoparsec-Tutorial.html教程,我试图学习如何与attoparsec一起使用管道。但我无法导入Control.Proxy.Trans.Either。这个模块位于哪个库中?
发布于 2017-02-03 03:24:19
您会碰到一个与pipes-attoparsec的旧版本相对应的旧版本的pipes。在最近的版本中,类似于第一个示例的内容将在没有管道的情况下编写。我们将使用parsed函数,它只是反复应用一个解析器,直到它失败为止,当解析器出现时,它会流成良好的解析。
{-# LANGUAGE OverloadedStrings #-}
import Pipes
import qualified Pipes.Prelude as P
import Pipes.Attoparsec
import Data.Attoparsec.Text
import Data.Text (Text)
data Name = Name Text deriving (Show)
hello :: Parser Name
hello = fmap Name $ "Hello " *> takeWhile1 (/='.') <* "."
helloparses :: Monad m => Producer Text m r -> Producer Name m (Either (ParsingError, Producer Text m r) r)
helloparses = parsed hello
process txt = do
e <- runEffect $ helloparses txt >-> P.print
case e of
Left (err,rest) -> print err >> runEffect (rest >-> P.print)
Right () -> return ()
input1, input2 :: Monad m => Producer Text m ()
input1 = each
[ "Hello Kate."
, "Hello Mary.Hello Jef"
, "f."
, "Hel"
, "lo Tom."
]
input2 = input1 >> yield "garbage"然后我们看到
-- >>> process input1
-- Name "Kate"
-- Name "Mary"
-- Name "Jeff"
-- Name "Tom"
-- >>> process input2
-- Name "Kate"
-- Name "Mary"
-- Name "Jeff"
-- Name "Tom"
-- ParsingError {peContexts = [], peMessage = "string"}
-- "garbage"pipes-attoparsec定义的另一个主函数就是parse。这会将attoparsec解析器转换为管道StateT解析器,以解析与解析器匹配的生产者的初始段。你可以在这里读到关于他们的http://www.haskellforall.com/2014/02/pipes-parse-30-lens-based-parsing.html
https://stackoverflow.com/questions/42012564
复制相似问题