2026-09-18
Compare2.hs
compare2 :: (Int, Int) -> String
compare2 pair = case pair of
(x, y) | x == y -> "equal"
| x > y -> "first bigger"
_ -> "second bigger"
main :: IO ()
main = mapM_ (putStrLn . compare2) [(3, 3), (5, 2), (1, 9)]
最初のcaseの枝は(x, y)というパターンにガードが2つ付いています。これは何を出力するでしょうか?
Answer
equal、first bigger、second bigger — 1行ずつ。(1, 9)もパターン(x, y)自体には一致しますが、そのガードx == yとx > yはどちらも成り立ちません。関数のガードなら、これで即座に非網羅的ガードの実行時エラーになりますが、caseの中では、1つの枝のガードが全て失敗しても処理全体は止まらず、次のパターン(ここでは_)へ移って試し直します。_はガード無しで常に一致するので"second bigger"になります。ガードの失敗は「そのガードの次」だけでなく「その枝ごと」を諦める、という点がポイントです。