rhaskelllazy-evaluationcall-by-need

Simple example of call-by-need


I'm trying to understand the theorem behind "call-by-need." I do understand the definition, but I'm a bit confused. I would like to see a simple example which shows how call-by-need works.

After reading some previous threads, I found out that Haskell uses this kind of evaluation. Are there any other programming languages which support this feature?

I read about the call-by-name of Scala, and I do understand that call-by-name and call-by-need are similar but different by the fact that call-by-need will keep the evaluated value. But I really would love to see a real-life example (it does not have to be in Haskell), which shows call-by-need.


Solution

  • The function

    say_hello numbers = putStrLn "Hello!"
    

    ignores its numbers argument. Under call-by-value semantics, even though an argument is ignored, the parameter at the function call site may need to be evaluated, perhaps because of side effects that the rest of the program depends on.

    In Haskell, we might call say_hello as

    say_hello [1..]
    

    where [1..] is the infinite list of naturals. Under call-by-value semantics, the CPU would run off trying to build an infinite list and never get to the say_hello at all!

    Haskell merely outputs

    $ runghc cbn.hs
    Hello!
    

    For less dramatic examples, the first ten natural numbers are

    ghci> take 10 [1..]
    [1,2,3,4,5,6,7,8,9,10]
    

    The first ten odds are

    ghci> take 10 $ filter odd [1..]
    [1,3,5,7,9,11,13,15,17,19]
    

    Under call-by-need semantics, each value — even a conceptually infinite one as in the examples above — is evaluated only to the extent required and no more.