練習問題 1.3.1

multiply を以下のように定義するものとする.

multiply        ::  (Integer,Integer) -> Integer
multiply (x,y)  =   if x == 0 then 0 else x * y
記号は2つの整数が等しいかどうかをテストするために使う.
e1 == e2
を評価するには,まず
e1
e2
を正規形にまで簡約してから,それぞれの結果が同一であるかどうかをテストすると仮定せよ. 遅延評価の下で,
multiply (0,infinity)
の値はどのような値になるか,
multiply (infinity,0)
の値はどうか.



それぞれの式の評価は以下のように進む

    multiply (0,infinity)
=   { multiply の定義 }
    if 0 == 0 then 0 else 0 * infinity
=   { 0 == 0 = True }
    if True then 0 else 0 * infinity
=   { if の then 部 }
    0

    multiply (infinity,0)
=   { multiply の定義 }
    if infinity == 0 then 0 else infinity * 0
=   { == の左オペランドの簡約.infinityの定義 }
    if (infinity+1) == 0 then 0 else infinity * 0
=   { infinityの定義 }
    if ((infinity+1)+1) == 0 then 0 else infinity * 0
... 
=   { 停止しない }
    ⊥
したがって,
multiply (0,infinity)
の値は
0
multiply (infinity,0)
の値は⊥である.