<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On 3 Nov 2018, at 08:59, Joachim Durchholz <<a href="mailto:jo@durchholz.org" class="">jo@durchholz.org</a>> wrote:</div><div class=""><div class="">If Haskell is truly pure, then IO must be pure as well.<br class="">That's why I think that IO functions are just describing impure activity, not doing it.<br class=""></div></div></blockquote><div><br class=""></div>I think that is exactly the best way to think about it (thanks!).  Right now I am teaching "Introduction to Functional Programming"</div><div>here, and have just introduced IO last week, so this is all in my head  right now.</div><div><br class=""></div><div>A Haskell IO program is just a description of a sequence of IO actions (IO a), which *when evaluated* will produce side-.effects</div><div>A function evaluation that produces side-effects when evaluated is a dangerous thing if used in an arbitrary fashion, but the IO abstraction(*)</div><div>prevents danger by (i) having a fixed sequence of such actions, and (ii) never allowing a Haskell program to have a direct reference to the part</div><div>of I/O state that gets modified.</div><div><br class=""></div><div>Haskell I/O is referentially transparent in that if you can show that two expressions of type IO a have the same I/O side-effecting behaviour</div><div>(using the monad laws plus some IO-action semantics) then one can replace the other in any Haskell context without altering the IO behaviour of that context.</div><div>Caveat: provided you don't use "unsafeXXXX" anywhere...</div><div><br class=""></div><div>(*) the IO abstraction happens to be an instance of a class called "Monad" that captures an interesting and useful pattern of sequential behaviour,</div><div>but this is really a bit of a red-herring when it come to understanding how Haskell has both side-effecting IO and "purity"</div><div><br class=""></div><div>PS - "purity" and "referential transparency" are slippy concepts, quite hard to pin down, so it is unwise to put too much value into those terms...</div><div><br class=""></div><div><br class=""><blockquote type="cite" class=""><div class=""><div class="">I have not been able to verify whether this is actually true. Maybe IO is really a wart on Haskell's purity.<br class="">I'd hate it if it were, and I think the Haskell design group would have hated that as well. OTOH IO is one of three approaches, and it happened to be the one that became usable first, so it's not part of the initial design process. Then again I like to think that SPJ wouldn't even contemplate something impure - but I don't really know.<br class="">_______________________________________________<br class="">Haskell-Cafe mailing list<br class="">To (un)subscribe, modify options or view archives go to:<br class=""><a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" class="">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br class="">Only members subscribed via the mailman list are allowed to post.</div></div></blockquote></div><br class=""><div class="">
<div style="color: rgb(0, 0, 0); letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">--------------------------------------------------------------------<br class="">Andrew Butterfield     Tel: +353-1-896-2517     Fax: +353-1-677-2204<br class="">Lero@TCD, Head of Foundations & Methods Research Group<br class="">School of Computer Science and Statistics,<br class="">Room G.39, O'Reilly Institute, Trinity College, University of Dublin<br class="">                         <a href="http://www.scss.tcd.ie/Andrew.Butterfield/" class="">http://www.scss.tcd.ie/Andrew.Butterfield/</a><br class="">--------------------------------------------------------------------</div>
</div>
<br class=""></body></html>