2026-09-15
MyIf.hs
myIf :: Bool -> a -> a -> a
myIf True t _ = t
myIf False _ e = e
safeDiv :: Int -> Int -> Int
safeDiv x y = myIf (y == 0) 0 (x `div` y)
main :: IO ()
main = print (safeDiv 10 0)
これは何を出力するでしょうか?
Answer
0(その後に改行)。ゼロ除算の例外にはなりません。Haskellでは関数の引数は呼び出し前に評価されず、必要になった時点で初めて評価されます。myIf Trueは第2引数0を返すだけで第3引数を使わないので、10 `div` 0は最後まで計算されません。正格評価の言語では同じ関数を書いても両方の引数が先に計算されるため、ifを普通の関数として自作できるのは遅延評価ならではです。