
Henning Thielemann wrote:
On Wed, 11 Jul 2007, Jules Bean wrote:
Now, supposing we have a library function which takes a callback. As an example, suppose we have a library function which reads in a file and calls our callback once on each line. A typical type might look like:
forEachLine :: Handle -> (String -> IO ()) -> IO ()
We have to provide a callback in the IO monad. But what if we don't want to work in the IO monad? What if we are working in, for example, a custom state monad of our own?
What about writing a function with signature
forEachLine :: MonadIO io => Handle -> (String -> io ()) -> IO ()
?
I think the best you can do is: MonadIO io => (String -> io()) -> io () 'MonadIO' lets you lift one way but not the other. Correct me if I'm wrong. As for that: yes, that would be great. It would be great if more libraries made their callbacks had signatures like that. But FFI libraries don't have that signature. (And it wouldn't be easy to make them; if you lift some IO into a ListT, then you'll cause the IO parts to be run more than once! This is expected behaviour but would probably confuse many C libraries). Jules