0

2 番目のパイプ ( ) がなくても問題ないパイプを使用した次のコードがあります>-> 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た複合モナドもそうです。を使用するには、生成する計算を(クラスから)を使用して複合モナドに持ち上げる必要があります。IOSafeTfillMD5liftMonadTrans

    >-> P.mapM (lift . fillMD5)

asがアクションをfillMD5生成するので、 のインスタンスから派生した を使用することもできます。IOliftIOMonadIOSafeT

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