<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Mar 17, 2015 at 10:55 PM, Mark Carter <span dir="ltr"><<a href="mailto:alt.mcarter@gmail.com" target="_blank">alt.mcarter@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Persuant to my previous question, I have made some progress, but there is something odd going on.<br>
<br>
Suppose we want to implement the following algorithm, which is a little simpler than the original problem:<br>
<br>
The user types the name of a file as input. Haskell then puts the text "it works" to that file. I tried this:<br>
<br>
import System.IO<br>
let openFileWrite name = openFile name WriteMode<br>
h :: IO Handle<br>
h <- fmap openFileWrite getLine -- you need to type in a file name<br>
<br>
This looks wrong, because h presumably needs to be a fixed Handle. Being an IO Handle seems to imply it is mutable. Haskell doesn't complain, though.<br></blockquote></div><br></div><div class="gmail_extra">No it doesn't, nothing is "mutable" in Haskell, you can have IORef or STRef whose content can be mutated in the IO or ST monad but the IORef or STRef themselves won't be mutable. IO Handle is not "a mutable Handle", it's an IO action that returns an Handle... And that's exactly the type of h in your code !<br><br></div><div class="gmail_extra">That's because this code doesn't open anything, it read a line and thanks to fmap, it applies openFileWrite to this line, giving you an "IO Handle" in h, an action that would give you an Handle if it was executed... but it is not executed, it is just stocked in h.<br></div><div class="gmail_extra">The type of "fmap openFileWrite getLine" is IO (IO Handle), not as you probably wanted IO Handle.<br><br></div><div class="gmail_extra">As Bob said, if you want an Handle, you shouldn't use fmap but rather (>>=). Or you could do :<br><br></div><div class="gmail_extra">act :: IO handle <- fmap openFileWrite getLine<br>h :: Handle <- act<br><br></div><div class="gmail_extra">but that's really not the usual way to do it (on the other hand it's interesting because it shows you that "IO a" are just values, you can manipulate them just like normal values.<br><br></div><div class="gmail_extra">Basically your code was "correct", it just didn't give you an Handle (that would have been clear as soon as you tried to use h as an Handle) !<br></div><div class="gmail_extra">-- <br></div><div class="gmail_extra">Jedaï<br></div></div>