Pipes.Safe - 如何使用mapM

时间:2014-05-26 19:26:55

标签: haskell haskell-pipes lifting

我有一个管道的下面的代码没有第二个管道(>-> P.mapM ( fillMD5))。 fillMD5是一项操作a -> IO a

runSafeT $ runEffect $
     every (senseRecursive5  startfpo)
        >-> P.mapM ( fillMD5)
        >-> P.map fp2rdf  
        >-> toNTriple houtfile   

错误是:

Couldn't match type `IO' with `Pipes.Safe.SafeT IO'
Expected type: Pipes.Safe.SafeT IO ()
  Actual type: IO ()
In the second argument of `($)', namely
  `runEffect

我了解mapM的类型是

mapM :: Monad m => (a -> m b) -> Pipe a b m r

但我不知道如何将其提升为Safe.SafeT

1 个答案:

答案 0 :(得分:6)

SafeT是monad转换器,因此SafeT IO是一个复合monad,IO包含在SafeT中。要使用fillMD5,您需要使用lift(来自MonadTrans类)提升它为复合monad生成的计算:

    >-> P.mapM (lift . fillMD5)

fillMD5生成IO操作时,您还可以使用来自liftIO SafeT实例的 >-> P.mapM (liftIO . fillMD5)

{{1}}