Dominic Steinitz wrote:

> Does anyone have any views on how to "wrap" code that has been designed to
> take input from handles but you now want to take input from strings? I want
> to make minimal changes to a module that already works and to code that uses
> that module. Here's my thinking below. I'd be interested in other approaches
> and pros and cons.

> Even nearer but still not good enough. So I went for type class:
> 
> class Monad m => Foo m where
>    get' :: Handle -> m Char
> 
> instance Foo IO where
>    get' = hGetChar
> 
> instance Foo (State String) where
>    get' = \_ -> do (x:xs) <- get; put xs; return x

For general usage, you would also need an equivalent of hIsEOF.

Also, for simple applications, you could just operate on String, and
use lazy I/O for dealing with files.

Aside: it would be useful to have a more robust interface to lazy I/O,
e.g.:

        withHandle :: Handle -> (String -> a) -> IO a

which would be roughly equivalent to:

        withHandle handle f = do
                string <- hGetContents handle
                return $ f string

except that exceptions would be handled correctly, i.e. withHandle
would throw the exception rather than just treating it as EOF.

-- 
Glynn Clements <[EMAIL PROTECTED]>
_______________________________________________
Haskell mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/haskell

Reply via email to