<div dir="ltr"><div>Frerich, the function would still be pure, even if it returns a poisoned recipe as you say. Thus, a little thought leads me to believe that the pattern would still not break if no unsafe* functions are used.</div><div><br></div></div><div class="gmail_extra"><br><div class="gmail_quote">On 16 March 2015 at 20:28, Sumit Sahrawat, Maths & Computing, IIT (BHU) <span dir="ltr"><<a href="mailto:sumit.sahrawat.apm13@iitbhu.ac.in" target="_blank">sumit.sahrawat.apm13@iitbhu.ac.in</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">Sorry for having strayed towards a different path. I'll try to answer only your question this time :)<div><br></div><div>An example from [1], for SML (bottom of the page) shows a function, with the following type signature in haskell</div><div><br></div><div><font face="monospace, monospace">    copyTextFile :: String -> String</font></div><div><br></div><div>One cannot write such a function in haskell that does the same thing because the example uses IO within a function with a pure looking type.</div><div><br></div><div>I'm sure people experienced with other functional languages will have good examples, so I'll leave it to them.</div><div><br></div><div>To answer your second question, I'm still not sure :).</div><div>I was just relaying how I understood purity, so that somebody might also correct me if I'm wrong.</div><div><br></div><div>Summarizing the discussion above, a function is pure if it gives the same output for the same input. Now a function returning 'IO a' always returns the same IO instructions (these instructions might be impure), but the function (by the virtue of always returning the same output for the same inputs) is ultimately pure. Frerich has also raised an important point that an IO computation might actually depend on some random file, which breaks this pattern.</div><div><br></div><div>[1]: <a href="http://www.cs.cornell.edu/courses/cs312/2006fa/recitations/rec09.html" target="_blank">http://www.cs.cornell.edu/courses/cs312/2006fa/recitations/rec09.html</a></div></div><div class="gmail_extra"><div><div class="h5"><br><div class="gmail_quote">On 16 March 2015 at 20:15, Simon Kitching <span dir="ltr"><<a href="mailto:simon@vonos.net" target="_blank">simon@vonos.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span>On 03/16/2015 03:04 PM, Heinrich Apfelmus wrote:<br>
</span><span><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Sumit Sahrawat, Maths & Computing, IIT (BHU) wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On 15 March 2015 at 23:19, <<a href="mailto:amindfv@gmail.com" target="_blank">amindfv@gmail.com</a>> wrote:<br>
<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
>From that perspective isn't every language pure? Haskell's still got<br>
"randomIO" and "print <=< readMVar"<br>
</blockquote>
<br>
Haskell is impure only when you use the unsafe* functions (atleast that's<br>
how I understand purity).<br>
<br>
My understanding is that a language is impure if it allows one to write<br>
arbitrary IO within a function and still give it a proper (mathematical)<br>
function type. In other words impurity arises only if you can unwrap the IO<br>
monad (which is what the unsafe functions do).<br>
<br>
The two examples you give above are pure under such a perspective, but I<br>
might be wrong.<br>
</blockquote>
<br>
You're right, indeed. A language is pure if supplying a value `x` of type `A` to the a function<br>
<br>
    A -> B<br>
<br>
will always returns the same result, no matter how often or in which order this function is called. This is true for both<br>
<br>
    randomIO             :: Random a => IO a<br>
    (readMVar >=> print) :: Show a   => MVar a -> IO ()<br>
<br>
because they return an IO action. This action will always be the same given the same arguments.<br>
<br>
The language would be impure if these functions had the types<br>
<br>
    randomIO             :: Random a => a<br>
    (readMVar >=> print) :: Show a   => MVar a -> ()<br>
</blockquote>
<br></span>
Doesn't "pure" correspond to "can write a unit test for"? When a function's return value only ever depends on its inputs, then I can<br>
write a set of test-cases for various inputs, and assert that the return-value has the expected content.<br>
<br>
A function that reads from a file, stdin, etc. cannot be tested in the same way; I cannot _assert_ that the returned value has specific content.<br>
<br>
 Sumit stated earlier that IO is "a pure program that can be executed", which seems similar to your description above (which I admit I<br>
don't yet 100% understand). How can I "assert" anything about this "program", or make a Haskell-based application 'safer' in any way by<br>
leveraging this kind of 'purity'?<br>
<br>
Thanks,<br>
Simon<div><div><br>
______________________________<u></u>_________________<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-<u></u>bin/mailman/listinfo/beginners</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div></div></div><span class="HOEnZb"><font color="#888888">-- <br><div><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div>Regards</div><div dir="ltr"><div><br></div><div>Sumit Sahrawat</div></div></div></div></div></div></div>
</font></span></div>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div>Regards</div><div dir="ltr"><div><br></div><div>Sumit Sahrawat</div></div></div></div></div></div></div>
</div>