2026-09-18
DescribeFraction.hs
describeFraction :: Int -> Int -> String
-- write this: "already in lowest terms" if gcd num den == 1,
-- otherwise "can be reduced"
describeFractionを、caseやif、whereを使わずガードだけで書いてください。gcd num denは1回だけ書くこと(ガードの中のletを使う)。
Reference
describeFraction :: Int -> Int -> String
describeFraction num den
| let g = gcd num den, g == 1 = "already in lowest terms"
| otherwise = "can be reduced"
ガードにはブール式だけでなく、whereの他にletという限定子(qualifier)も書けます(Haskell 2010で標準入り)。,で区切った1つ目のlet g = gcd num denがその場でgを束縛し、続くg == 1がそれを使います。このgは同じガードの中だけで有効なので、他の枝と値を共有したいwhereとは違い、1つの枝だけで使う一時的な計算に向いています。これは参考実装であり、唯一の正解ではありません。