On Thu, Feb 5, 2009 at 12:27 PM, Jonathan Cast <jonathanccast@fastmail.fm> wrote:
On Thu, 2009-02-05 at 12:21 -0800, David Leimbach wrote:
>
>
> On Thu, Feb 5, 2009 at 11:25 AM, Andrew Wagner
> <wagner.andrew@gmail.com> wrote:
>                         I think the point of the Monad is that it
>                         works as a container of stuff, that still
>                         allows mathematically pure things to happen,
>                         while possibly having some opaque "other
>                         stuff" going on.

>          This at least sounds, very wrong, even if it's not. Monads
>         are not impure. IO is, but it's only _one_ instance of Monad.
>         All others, as far as I know, are pure. It's just that the
>         bind operation allows you to hide the stuff you don't want to
>         have to worry about, that should happen every time you compose
>         two monadic actions.


> Well all I can tell you is that I can have (IO Int) in a function as a
> return, and the function is not idempotent in terms of the "stuff"
> inside IO being the same.

Sure it's the same.

>  cmp /bin/cat /bin/cat
> cp /bin/cat ~
> cmp /bin/cat ~/cat
>

Pretty much the same, anyway.

jcc


So if IO represents a program that when executed interacts with the world's state, is it safe to say that when I return (State Int Int), that I'm returning a "State program"?  That'd make sense as it really does look like we force the State to be evaluated with runState, evalState or execState.

The only difference with IO then is that to get IO programs to run, you have to do it inside another IO program.

I hope I'm not making this worse! :-)