0

我有以下带有管道的代码,没有第二个管道(>-> 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

4

1 回答 1

6

SafeT是一个单子转换器,SafeT IO一个复合单子IO也是如此SafeT。要使用fillMD5,您需要使用(来自类)将它产生的计算提升到复合单子:liftMonadTrans

    >-> P.mapM (lift . fillMD5)

fillMD5产生一个IO动作时,你也可以使用liftIO,它来自 的MonadIO实例SafeT

    >-> P.mapM (liftIO . fillMD5)
于 2014-05-26T19:41:15.287 回答