"Cristian Baboi" <cristi at ot.onrc.ro> writes:
> On Tue, 18 Dec 2007 11:56:36 +0200, Jon Fairbairn
> <jon.fairbairn at cl.cam.ac.uk> wrote:
>>> "Cristian Baboi" <cristi at ot.onrc.ro> writes:
>>>>> - the syntax for a block
>>>> Not sure what you mean by "block".
>>>> do a <- [1..10]
>> b <- [3,4]
>> return (a,b)
>>>> is an expression... you can write that same expression as
>> do {a <- [1..10]; b <- [3,4]; return (a,b)} too.
>>> I mean anything that you can put between "{" "}", and between ";"
That's a bit like asking for the syntax of anything you can
put between "(" and ")"; The braces are used for grouping,
and can group different things:
case 2 of {1 -> 2 ; 2 -> 2}
do {a <- Just 1; return a}
> Is this ([1 ,2 ,3 ,4]) a tuple or what ?
> It has commas in it!
Not in any meaningful sense...
>>> - what guarantees are made by the LANGUAGE that an IO action
>>> (such as do putStrLn "Hello world" ) is not performed
>>> twice
>>> As has been pointed out, «do putStrLn "Hello world"» is an
>> expression that you can bind to a variable and use as many
>> times as you like.
>> Yes, but that was not the question.
> What make you so sure it will be printed the exact number of
> times you intended ?
I don't understand your question at all, then. How many
times it gets printed depends on how many times the
programme is run, for one thing. Otherwise, it's a matter of
the definition of the semantics of the language. Evaluation
of a Haskell programme proceeds from evaluation of «main»,
which returns an object of type IO -- a sequence of
Input/Output operatens -- that is "run". IO doesn't happen
when you evaluate an IO action, it happens when the IO
action is run. For example, if you define
f x = seq (putStrLn "foo!") (x+1)
and have
main = print (f 2)
the «putStrLn "foo!"» is evaluated because seq forces its
first argument, but the only output you get is 3.
>> This is a fundamental property of the language. A lambda
>> expression is programme and at runtime the system doesn't
>> know one lambda expression from another (all it can do with
>> one is apply it to something).
>> Even C can apply a function variable to an argument (function pointers).
The secret of good language design is not what the language
allows, it's what the language forbids.
--
Jón Fairbairn Jon.Fairbairn at cl.cam.ac.uk