无法导入 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