
I mean literally use the function `lift`. Proxy (it's the underlying type of all pipes, Pipe is a type synonym that expands to Proxy, filling some type variables for you) implements the MonadTrans class (from http://hackage.haskell.org/package/transformers-0.5.1.0/docs/Control-Monad-T...): class MonadTrans t where lift :: Monad m => m a -> t m a So, if `t` is `Pipe a b` and `m` is IO, then `lift` becomes: lift :: IO r -> Pipe a b IO r Thus, for example, `lift (c_hkl_engine_list_init engines geometry detector sample)` will return `Pipe a b IO <something>` (for any `a` and `b`, this is going to be a trivial pipe that doesn't yield or await anything, and just executes the effect) rather than `IO <something>`. You don't need to import the Monad.Trans.Class module, Pipe reexports it for you. Best regards, Marcin Mrotek