<div dir="ltr">You can't do<div><br>putStrLn (getLine ++ getLine)<br></div><div><br></div><div>so of course you can't do such transformations. I would suggest you rewrite your IO action without any syntactic sugar (with plain >> and >>=) first and then try to do transformations.</div><div><br></div><div>I general, I find it useful to think of IO actions in two ways:</div><div>- as a value of IO type that your main is (kind of instructions that Haskell runtime should perform).</div><div>- the effects execution of this value causes.</div><div><br></div><div>You can think that the sole purpose of your program is to construct this IO value, while its execution is performed kind of outside of your program. If you think that way, IO is again pure, obeys all monad rules and categorically valid monad.</div><div><br></div><div>Regards,</div><div>Alexey Shmalko</div></div><br><div class="gmail_quote">On Sun, Apr 26, 2015 at 3:22 PM Joel Neely <<a href="mailto:joel.neely@gmail.com">joel.neely@gmail.com</a>> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_default" style="font-family:georgia,serif;font-size:small">Shishir,</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small">I'll reply as an humble programmer, not a category theorist. For me the clarifying example was to contrast</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default" style="font-size:small"><font face="monospace, monospace">putStrLn (getLine ++ getLine)</font></div></blockquote><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small">with</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default" style="font-size:small"><font face="monospace, monospace">s = square 3 + square 4</font></div></blockquote><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small">where</div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default" style="font-size:small"><font face="monospace, monospace">square x = x * x</font></div></blockquote><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><div class="gmail_default" style="font-size:small"><span style="font-family:georgia,serif">There is absolutely nothing that "leaks" between the two sub-expressions involving </span><font face="monospace, monospace">square</font><font face="georgia, serif">, so I'm free to rewrite as:</font></div><div class="gmail_default" style="font-size:small"><font face="georgia, serif"><br></font></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default" style="font-size:small"><font face="monospace, monospace">a = square 3</font></div><div class="gmail_default" style="font-size:small"><font face="monospace, monospace">b = square 4</font></div><div class="gmail_default" style="font-size:small"><font face="monospace, monospace">s = a + b</font></div></blockquote><div class="gmail_default" style="font-size:small"><font face="georgia, serif"><br></font></div><div class="gmail_default" style="font-size:small"><font face="georgia, serif">or</font></div><div class="gmail_default" style="font-size:small"><font face="georgia, serif"><br></font></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default" style="font-size:small"><div class="gmail_default"><font face="monospace, monospace">b = square 4</font></div></div><div class="gmail_default" style="font-size:small"><div class="gmail_default"><font face="monospace, monospace">a = square 3</font></div></div><div class="gmail_default" style="font-size:small"><div class="gmail_default"><font face="monospace, monospace">s = a + b</font></div></div></blockquote><div class="gmail_default" style="font-size:small"><div><font face="georgia, serif"><br></font></div></div><div class="gmail_default" style="font-size:small"><font face="georgia, serif">or</font></div><div class="gmail_default" style="font-size:small"><font face="georgia, serif"><br></font></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default" style="font-size:small"><font face="monospace, monospace">x = square 7</font></div><div class="gmail_default" style="font-size:small"><div class="gmail_default"><span style="font-family:monospace,monospace">b = square 4</span><br></div></div><div class="gmail_default" style="font-size:small"><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace">a = square 3</font></div></div><div class="gmail_default"></div><div class="gmail_default"><font face="monospace, monospace">s = a + b</font></div></div><div class="gmail_default" style="font-size:small"><div class="gmail_default"><div class="gmail_default"><div class="gmail_default"><font face="monospace, monospace">y = square 8</font></div></div><div class="gmail_default"></div></div></div></blockquote><div class="gmail_default" style="font-size:small"><div class="gmail_default"><font face="georgia, serif"><br></font></div><div><font face="georgia, serif">or</font></div><div><font face="georgia, serif"><br></font></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default" style="font-size:small"><div><font face="monospace, monospace">hh m n = square m + square n</font></div></div><div class="gmail_default" style="font-size:small"><div><font face="monospace, monospace">x = square 7</font></div></div><div class="gmail_default" style="font-size:small"><div><font face="monospace, monospace">s = hh 3 4</font></div></div><div class="gmail_default" style="font-size:small"><div><font face="monospace, monospace">y = square 8</font></div></div></blockquote><div class="gmail_default" style="font-size:small"><div><font face="georgia, serif"><br></font></div><div><font face="georgia, serif">without altering the value of </font><font face="monospace, monospace">s</font><font face="georgia, serif"> or any surrounding computation. In that last case, I can now freely intermingle uses of </font><font face="monospace, monospace">hh</font><font face="georgia, serif"> and </font><font face="monospace, monospace">square</font><font face="georgia, serif"> without risk.</font></div><div><font face="georgia, serif"><br></font></div><div><font face="georgia, serif">But if I were to attempt the same gymnastics with </font><font face="monospace, monospace">putStrLn</font><font face="georgia, serif"> and </font><font face="monospace, monospace">getLine</font><font face="georgia, serif">, I wouldn't have those freedoms. The order of evaluation/performance now becomes critical.</font></div><div><font face="georgia, serif"><br></font></div><div><font face="georgia, serif">So the monad provides a way to manage the composition, and the type system ensures visibility to the fact that something more is going on when a defined function includes IO behavior.</font></div><div><font face="georgia, serif"><br></font></div><div><font face="georgia, serif">Hope that helps,</font></div><div><font face="georgia, serif">-jn-</font></div><div><font face="georgia, serif"><br></font></div></div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div><div class="gmail_default" style="font-family:georgia,serif;font-size:small"><br></div></div><div class="gmail_extra"></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Apr 26, 2015 at 4:59 AM, Shishir Srivastava <span dir="ltr"><<a href="mailto:shishir.srivastava@gmail.com" target="_blank">shishir.srivastava@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>Hi, </div><div><br></div><div>Can someone please explain how IO operations do not fit in the pure category of mathematical function in that they have to be implemented via Monads.</div><div><br></div><div>For e.g. the <font face="monospace, monospace">getLine </font>function has the type <font face="monospace, monospace">IOString </font><font face="arial, helvetica, sans-serif">and it reads the input from the user. Now as I see it the output of getLine will always be same if the input remain same (i.e. for input "X" </font><font face="monospace, monospace">getLine </font><font face="arial, helvetica, sans-serif">will always return "X" ) which is the constraint on mathematical functions.</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">Therefore I don't see why monads are necessary for implementing IO in pure languages.</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">I can understand why </font><font face="monospace, monospace">Date </font><font face="arial, helvetica, sans-serif">and </font><font face="monospace, monospace">Random </font><font face="arial, helvetica, sans-serif">functions have be implemented via monads because their output will always change.</font></div><div><font face="arial, helvetica, sans-serif"><br></font></div><div><font face="arial, helvetica, sans-serif">Thanks,</font></div><div><div><div dir="ltr"><font color="#0b5394"><font style="background-color:rgb(255,255,255)"><font size="2" face="georgia, serif">Shishir </font></font></font><br></div></div></div>
</div>
<br>_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
<br></blockquote></div><br><br clear="all"><div><br></div></div><div class="gmail_extra">-- <br><div>Beauty of style and harmony and grace and good rhythm depend on simplicity. - Plato</div>
</div>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
</blockquote></div>