Steve Horne wrote:
Heinrich Apfelmus wrote:
Maybe it helps to try to find an example of a function f :: A -> B
for some cleverly chosen types A,B that is not pure, i.e. does not
return the same values for equal arguments.
[..]
For your specific challenge, place that as a left-hand argument in a
bind...
f :: Int -> IO Int
f = getAnIntFromTheUser >>= \i -> return (i+1)
Well, the value of i isn't decidable until runtime. The value of i+1 is
not decidable until runtime. The value of return (i+1) is not decidable
until runtime and so on. It can only be partially evaluated at
compile-time, but when it is fully evaluated, you get a different IO
action returned by f depending on what Int you got from the user.
The function
f :: Int -> IO Int
f x = getAnIntFromTheUser >>= \i -> return (i+x)
is pure according to the common definition of "pure" in the context of
purely functional programming. That's because
f 42 = f (43-1) = etc.
Put differently, the function always returns the same IO action, i.e.
the same value (of type IO Int) when given the same parameter.
Best regards,
Heinrich Apfelmus
--
http://apfelmus.nfshost.com
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe