On Thu, Dec 29, 2011 at 07:19:17AM -0600, Gregg Reynolds wrote: > On Wed, Dec 28, 2011 at 2:44 PM, Heinrich Apfelmus > <apfel...@quantentunnel.de> wrote: > > > > The beauty of the IO monad is that it doesn't change anything about purity. > > Applying the function > > > > bar :: Int -> IO Int > > > > to the value 2 will always give the same result: > > > > bar 2 = bar (1+1) = bar (5-3) > > Strictly speaking, that doesn't sound right. The "result" of an IO > operation is outside of the control (and semantics) of the Haskell > program, so Haskell has no idea what it will be. Within the program, > there is no result. So Int -> IO Int is not really a function - it > does not map a determinate input to a determinate output. The IO > monad just makes it look and act like a function, sort of, but what it > really does is provide reliable ordering of non-functional operations > - invariant order, not invariant results.
Not only strictly speaking. In practice too: bar _ = do s <- readFile "/tmp/x.txt" return (read s) Once you're in a monad that has 'state', the return value doesn't strictly depend anymore on the function arguments. At least that's my understanding. regards, iustin _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe