On 30/12/2011 01:37, Chris Smith wrote:
On Fri, 2011-12-30 at 00:44 +0000, Steve Horne wrote:
So, to resurrect an example from earlier...
f :: Int -> IO Int
f = getAnIntFromTheUser>>= \i -> return (i+1)
Did you mean f :: IO Int ? If not, then I perhaps don't understand
your example, and your monad is not IO. I'll continue assuming the
former.
Oops - I meant...
f :: Int -> IO Int
f x = getAnIntFromTheUser >>= \i -> return (i+x)
Your version should be fine, only the lack of a parameter makes a
superficial difference.
I certainly agree that the GHC runtime system, and any other Haskell
implementation's runtime system as well, evaluates expressions (some
representation of them anyway), and does lots of destructive updates
to boot. This isn't at issue. What is at issue is whether to shoehorn
those effects into the language semantics as a side-effect of
evaluation (or equivalently, force evaluation of expressions to be
seen as an effect -- when you only allow for one of these concepts,
it's a silly semantic game as to which name you call it by), or to
treat effects as semantically first-class concepts in their own right,
different from the simplification of expressions into values.
Well, we're playing a semantic game anyway. Treating effects as
first-class concepts in themselves is fine, but IMO doesn't make Haskell
pure.
If you do, we're back to my original model. The value returned by main
at compile-time is an AST-like structure wrapped in an IO monad
instance.
Here you're introducing implementation detail here that's rather
irrelevant to the semantics of the language.
Think of it as an analogy - using the terminology of compiler design. I
might describe arithmetic in terms of an abacus too - it doesn't mean
I'd only get those results if I used an abacus.
The implementation details don't matter - the behaviour of the program does.
Purity isn't about the RTS implementation, which is of course plenty
effectful and involves lots of destructive updates. It's about the
language semantics.
And the semantics of primitive IO actions *include* the run-time effects
- those semantics are defined in the Haskell Report. For example...
Computation hGetChar hdl reads a character from the file or channel
managed by hdl.
If you have another meaning in mind for the word "semantics", well
that's fine. As already discussed with "side effects", natural language
is sadly ambiguous. It can be confusing, but it doesn't change the facts
or the logic.
I don't know the first thing about denotational semantics, but I do know
this - if you place run-time behaviour outside the scope of your model
of program semantics, that's just a limitation of your model. It doesn't
change anything WRT the program itself - it only limits the
understanding you can derive using that particular model.
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe