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)
Другие вопросы по тегам