遅延評価と正格評価

正格評価の言語 Ruby と比較してみる。

~$ irb
irb(main):001:0> def trace(str)
irb(main):002:1>   puts str
irb(main):003:1>   return str
irb(main):004:1> end
=> nil
irb(main):005:0> trace "hello"
hello
=> "hello"

# a に配列を代入した時点で trace 関数が実行される。
irb(main):006:0> a = ["Hello",trace(" world!")] 
 world!
=> ["Hello", " world!"]
irb(main):007:0> a[0]
=> "Hello"
irb(main):008:0> a[1]
=> " world!"

haskell はリストにaを束縛した時点では traceは実行されない。

ghci> let a=["Hello",trace (" world!")(" world!")]
ghci> a!!0                                        
"Hello"
-- 2 番目のリストの値を呼ばれた時点で trace が実行されている。
ghci> a!!1
" world!
 world!"
-- 評価が完了しているので次からは trace は実行されない。
ghci> a!!1
" world!"
ghci> a!!1
" world!"