正格評価の言語 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!"