无法导入 Control.Proxy.Trans.Either
cannot import Control.Proxy.Trans.Either
我正在尝试按照教程 https://hackage.haskell.org/package/pipes-attoparsec-0.1.0.1/docs/Control-Proxy-Attoparsec-Tutorial.html 学习如何将管道与 attoparsec 一起使用。但是我无法导入 Control.Proxy.Trans.Either 。该模块位于哪个库中?
您找到了与 pipes
的旧版本相对应的 pipes-attoparsec
的旧版本。在最近的版本中,像第一个示例这样的东西将在没有管道的情况下编写。我们将使用 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://hackage.haskell.org/package/pipes-attoparsec-0.1.0.1/docs/Control-Proxy-Attoparsec-Tutorial.html 学习如何将管道与 attoparsec 一起使用。但是我无法导入 Control.Proxy.Trans.Either 。该模块位于哪个库中?
您找到了与 pipes
的旧版本相对应的 pipes-attoparsec
的旧版本。在最近的版本中,像第一个示例这样的东西将在没有管道的情况下编写。我们将使用 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