Pipes.Safe - как использовать mapM
У меня есть следующий код с трубы, которая в порядке без второй трубы (>-> 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 ответ
Решение
SafeT
это монадный трансформатор, и так SafeT IO
составная монада с IO
завернут в SafeT
, Использовать fillMD5
нужно поднять вычисление, которое он производит, в составную монаду, используя lift
(от MonadTrans
учебный класс):
>-> P.mapM (lift . fillMD5)
Как fillMD5
производит IO
действие, вы также можете использовать liftIO
, который исходит от MonadIO
экземпляр SafeT
:
>-> P.mapM (liftIO . fillMD5)