我有一个管道的下面的代码没有第二个管道(>-> 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
?
答案 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}}