練習問題 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)の値は⊥である.