1
votes

I've been trying out pipes-attoparsec but haven't been having much luck.

It appears that there is a type mismatch between Void and X in (what seems to be) relatively straightforward code. From what I've read in the library (that this will be a type synonym at some point), I'm not sure how to interpret the type error.

Test code:

{-# LANGUAGE OverloadedStrings,RankNTypes #-}
module Main where

import qualified Data.Attoparsec.Char8 as A

import qualified Pipes as P
import qualified Pipes.Attoparsec as PA        
import qualified Pipes.ByteString as PB
import qualified Pipes.Parse  as PP

passthrough :: A.Parser PB.ByteString
passthrough = A.takeWhile (\s->True)

f :: Monad m => PP.StateT (P.Producer PB.ByteString m r) m (Either String  String)
f = do
  r <- PA.parse passthrough
  return $ case r of
    Left e -> Left "a"
    Right (_,r1) -> Right "b"

g = PP.evalStateT f PB.stdin

h = P.runEffect g

This results in the error:

P.hs:16:8:
    Couldn't match type `pipes-4.0.2:Pipes.Internal.Proxy
                           Data.Void.Void () () PB.ByteString m r0'
                  with `P.Proxy P.X () () PB.ByteString m r'
    Expected type: PP.StateT
                     (PP.Producer PB.ByteString m r)
                     m
                     (Either PA.ParsingError (Int, PB.ByteString))
      Actual type: PP.StateT
                     (pipes-4.0.2:Pipes.Core.Producer PB.ByteString m r0)
                     m
                     (Either PA.ParsingError (Int, PB.ByteString))
    In the return type of a call of `PA.parse'
    In a stmt of a 'do' block: r <- PA.parse passthrough
    In the expression:
      do { r <- PA.parse passthrough;
           return
           $ case r of {
               Left e -> Left "a"
               Right (_, r1) -> Right "b" } } Failed, modules loaded: none.
2

2 Answers

1
votes

You need to upgrade to the latest pipes-attoparsec, which restricts its pipes dependency to 4.1.*. I can give you more detailed information for how this might have arisen if you list what versions you have installed for pipes, pipes-parse, and pipes-attoparsec. If you type ghc-pkg list | grep pipes that should be enough.

0
votes

It looks like you are using pipes-4.1.0 with a version pipes-attoparsec(or another pipes-* package I can not tell for sure from the error message alone.) that expects pipes-4.0.2.

There is a good chance you need to use ghc-pkg hide to hide an older version of pipes-attoparsec(or other pipes-* package) if you have both the old and the recent version installed. I have had to do this with other packages occasionally, it is not clear to me how cabal/ghci/ghc get in the state where is necessary however.

Use ghc-pkg list | grep pipes-attoparsec to see which versions you have installed and try hiding the older one. If you only have the older one installed then use cabal install to get the new one.

The Void vs X mismatch comes from pipes-4.1.0 way from the void package.