On Mon, Feb 9, 2009 at 4:38 AM, Tony Morris <span dir="ltr"><<a href="mailto:tmorris@tmorris.net">tmorris@tmorris.net</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<div class="Ih2E3d">-----BEGIN PGP SIGNED MESSAGE-----<br>
Hash: SHA1<br>
<br>
</div>I also agree it is a value.<br>
The original post was attempting to make a distinction that does not<br>
exist. I deliberately avoided that topic.<br>
<div class="Ih2E3d"><br>
"A thing cannot be both a value and a function, but e,g, getChar"<br>
<br>
</div>My original intent was to hope the poster reconsidered the whole post.<br>
You've blown my cover :)<br></blockquote><div><br>My bad, I restate: a value cannot be both static and dynamic. Or an object and a morphism. Or an element and a function. Sure, you can treat a morphism as an object, but only by moving to a higher (or different) level of abstraction. That doesn't erase the difference between object and morphism. If you do erase that difference you end up with mush. getChar /looks/ like an object, but semantically it must be a morphism. But it can't be a function, since it is non-deterministic. So actually the logical contradiction comes from the nature of the beast.<br>
<br>Another reason it's confusing to newcomers: it's typed as "IO Char", which looks like a type constructor. One would expect getChar to yield a value of type IO Char, no? But it delivers a Char instead. This is way confusing. So I take "type IO foo" to mean "type foo, after a side effect". In a sense "getChar :: IO Char" isn't even a true type signature.<br>
<br>In any case, many thanks to all who have contributed to the thread. It's sharpened my thinking revealed weaknesses in my terminology, and I expect I'll make my inevitable contribution to the infinite Haskell tutorial on the topic before too long.<br>
<br>-gregg<br></div></div>