
At 7:42 AM +0200 8/20/03, Jan Scheffczyk wrote:
Hi Andrew,
let x = expensiveComputation foo in x + x
I would certainly hope that expensiveComputation wasn't called twice, and even though the language doesn't guarantee it, I have already written code that assumed it.
I always thought that there is a tiny difference between "let" and "where": Using "let" "expensiveComputation foo" might be computed twice (depending on the compiler?). But using:
x + x where x = expensiveComputation foo
should compute the value for x only once. Therefore, I always try to use "where" for common subexpressions.
Please correct me if I'm wrong here.
The reserved word "let" introduces an expression (a "let-expression"), but there's no such thing as a "where-expression". The reserved word "where" can be used only in definitions. For example, 3 + ((x + x) where x = expensiveComputation foo) is invalid syntax, whereas 3 + let x = expensiveComputation foo in x + x is OK. And here's a use of "where" in a definition: let z = x + x where x = 2 in z*5 That could have been written using only "let": let z = let x = 2 in x + x where x = 2 in z*5 Watch out for the Hugs 98 command line-- it allows z*5 where z = x + x where x = 2 but that's not a truly valid expression, because you can't embed it in a larger expression: 2 + (z*5 where z = x + x where x = 2) is properly identified as a syntax error. Regards, --Ham -- ------------------------------------------------------------------ Hamilton Richards, PhD Department of Computer Sciences Senior Lecturer The University of Texas at Austin 512-471-9525 1 University Station C0500 Taylor Hall 5.138 Austin, Texas 78712-1188 ham@cs.utexas.edu hrichrds@swbell.net ------------------------------------------------------------------