Lazy evaluation
From HaskellWiki
(cyclic graphs of pointers) |
(Java allows for cyclic pointer graphs) |
||
| Line 32: | Line 32: | ||
That is lazy evaluation allows us to define cyclic graphs of pointers with warrantedly valid pointers. | That is lazy evaluation allows us to define cyclic graphs of pointers with warrantedly valid pointers. | ||
In contrast to that C allows cyclic graphs of pointers, but pointers can be uninitialized, which is a nasty security hole. | In contrast to that C allows cyclic graphs of pointers, but pointers can be uninitialized, which is a nasty security hole. | ||
| - | + | An eagerly evaluating functional language without hacks, would only allow for acyclic graphs of pointers. | |
Revision as of 14:57, 14 December 2007
Lazy evaluation means Non-strict semantics and Sharing. A kind of opposite is eager evaluation.
Non-strict semantics allows to bypass undefined values (e.g. results of infinite loops) and this way it also allows to process formally infinite data.
When it comes to machine level and efficiency issues then it is important whether equal objects share the same memory.
A Haskell program cannot observe whetherIn many cases it is also not necessary to know it, but in some cases the difference between shared and separated objects yields different orders of space or time complexity.
Consider the infinite listBut with lazy evaluation (i.e. sharing) this becomes a list with a loop, a pointer back to the beginning. It does only consume constant space. In an imperative language (here Modula-3) the same would be achieved with the following code:
TYPE
List =
REF RECORD
next: List;
value: INTEGER;
END;
VAR x := NEW(List, value:=1); BEGIN x.next := x; END;
That is lazy evaluation allows us to define cyclic graphs of pointers with warrantedly valid pointers. In contrast to that C allows cyclic graphs of pointers, but pointers can be uninitialized, which is a nasty security hole. An eagerly evaluating functional language without hacks, would only allow for acyclic graphs of pointers.
