Difference between revisions of "Lazy evaluation"

From HaskellWiki
Jump to navigation Jump to search
m
(cyclic list with constant space consumption)
Line 1: Line 1:
 
'''Lazy evaluation''' means [[Non-strict semantics]] and [[Sharing]].
 
'''Lazy evaluation''' means [[Non-strict semantics]] and [[Sharing]].
  +
  +
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 whether <hask>2+2 :: Int</hask> and <hask>4 :: Int</hask> are different objects in the memory.
  +
In 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 list <hask> let x = 1:x in x </hask>.
  +
For the non-strict semantics it would be ok to store this as a flat list <hask> 1 : 1 : 1 : 1 : ... </hask>,
  +
with memory consumption as big as the number of consumed <hask>1</hask>s.
  +
But 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 [http://www.modula3.org/ Modula-3]) the same would be achieved with the following code:
  +
  +
<code>
  +
TYPE
  +
List =
  +
REF RECORD
  +
next: List;
  +
value: INTEGER;
  +
END;
  +
  +
VAR
  +
x := NEW(List, value:=1);
  +
BEGIN
  +
x.next := x;
  +
END;
  +
</code>
  +
   
 
[[Category:Glossary]]
 
[[Category:Glossary]]

Revision as of 14:29, 27 November 2007

Lazy evaluation means Non-strict semantics and Sharing.

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 whether 2+2 :: Int and 4 :: Int are different objects in the memory. In 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 list let x = 1:x in x. For the non-strict semantics it would be ok to store this as a flat list 1 : 1 : 1 : 1 : ..., with memory consumption as big as the number of consumed 1s. But 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;