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