You can use `Control.Monad.void`:

    void :: Functor m => m a -> m ()
    void m = fmap (\_ -> ()) m

Another equivalent way to do this is:

    (p >> return ())

... where `p` is the `Producer` whose return value you want to swallow.
This actually works for any `Monad`, not just `Producer`.
 On Jul 10, 2014 11:52 AM, "Sibi Prabakaran" <[email protected]> wrote:

>
> I have the following piece of code which typechecks perfectly:
>
> import           Control.Applicative ((<*))
> import           Control.Monad (liftM)
> import           Data.Attoparsec.Text
> import           Pipes
> import           Pipes.Attoparsec (parsed, ParsingError)
> import qualified Pipes.Prelude as P
> import           Pipes.Text.IO (fromHandle)
> import qualified System.IO as IO
>
> type LinkID = Int
>
> data Link = Link {
>   lid :: LinkID,
>   llength :: Int
>   }
>
> data Snap = Snap {
>   slid :: LinkID,
>   slength :: Int
>   }
>
> getSnap
>   :: Monad m
>   => Int
>   -> Producer Link m ()
>   -> Producer Snap m ()
>   -> Producer (LinkID, [Snap]) m ()
> getSnap n lks snp = do
>   snp' <- lift (P.toListM snp)
>   lks >-> P.filter (\x -> lid x > n)
>         >-> P.map (\x -> (lid x, filter (\y -> lid x == slid y) snp'))
>
> drawData :: (LinkID, [Snap]) -> IO ()
> drawData = undefined
>
> linkFile = "some file path"
> snapshotFile = "some file path"
>
> parseLink :: Parser Link
> parseLink = undefined
>
> snapshotParser :: Parser Snap
> snapshotParser = undefined
>
> Note that some parts of the code are defined as undefined for the sake of
> brevity. Now when I include main function it doesn't typecheck:
>
> main = IO.withFile linkFile IO.ReadMode $ \linkHandle ->
>   IO.withFile snapshotFile IO.ReadMode $ \snapHandle -> runEffect $
>   for (getSnap 2 (parsed (parseLink <* endOfLine) (fromHandle linkHandle))
>        (parsed (snapshotParser <* endOfLine) (fromHandle snapHandle))) $
> \d ->
>   lift (drawData d)
>
> The error:
>
> Expected type: Producer Link IO ()
>       Actual type: Producer
>                      Link
>                      IO
>                      (Either (ParsingError, Producer
> Data.Text.Internal.Text IO ()) ())
>     In the return type of a call of `parsed'
>     In the second argument of `getSnap', namely
>
> Now, in order to fix this problem, I change getSnap function:
>
> getSnap
>   :: Monad m
>   => Int
>   -> Producer Link m r
>   -> Producer Snap m r
>   -> Producer (LinkID, [Snap]) m r
> getSnap n lks snp = do
>   snp' <- lift (P.toListM snp)
>   lks >-> P.filter (\x -> lid x > n)
>         >-> P.map (\x -> (lid x, filter (\y -> lid x == slid y) snp'))
>
> Now, it seems P.toListM only operates on Producer a m () so, I want to
> convert Producer a m r to that. What is the recommended way of solving this
> problem ?
>
> --
> You received this message because you are subscribed to the Google Groups
> "Haskell Pipes" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To post to this group, send email to [email protected].
>

-- 
You received this message because you are subscribed to the Google Groups 
"Haskell Pipes" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].

Reply via email to