
On Tue, Dec 8, 2009 at 7:22 PM, Lee Houghton
I like this idea.
Thanks
A small observation, though:
stdin :: ReadModes ioMode => Handle ioMode stdin = Handle SIO.stdin
This allows writing to stdin by choosing ReadWriteMode as the ioMode. I think it would be better to have just
stdin :: Handle ReadMode
*HandleExplicitIOMode> hPutStrLn (stdin :: Handle ReadWriteMode) "This shouldn't typecheck!" *** Exception: <stdin>: hPutStr: illegal operation (handle is not open for writing)
This also shows another reason for stdin, stdout and stderr to be monomorphic:
hGetLine stdin
<interactive>:1:0: Ambiguous type variable `ioMode' in the constraint: `ReadModes ioMode' arising from a use of `hGetLine' at <interactive>:1:0-13 Probable fix: add a type signature that fixes these type variable(s)
Rightly spotted, thanks! I will change the types to: stdin :: Handle ReadMode stdout :: Handle WriteMode stderr :: Handle WriteMode Or are there scenarios where people want to write to stdin or read from stdout or stderr? I think I will also rename the IOMode constructors to their System.IO.IOMode equivalents. Then I will also have to rename the ioMode types like so: data IOMode ioMode where ReadMode :: IOMode R WriteMode :: IOMode W AppendMode :: IOMode A ReadWriteMode :: IOMode RW Then there are two decisions I still have to make: 1) How to name the module? What about: System.IO.ExplicitIOModes? 2) What to export? Do I only need to export the changed functions and types like I have now: http://hpaste.org/fastcgi/hpaste.fcgi/view?id=13782 or do I need to export all the other things that System.IO exports. In the latter case users have the advantage that they can just swap their import of System.IO with System.IO.ExplicitIOModes When I have time I will put this in a package and upload it to hackage. Oh yes, final question: how to name this package? What about explicit-iomodes? regards, Bas