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

_______________________________________________
Haskell-Cafe mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to