2026-09-15
Describe.hs
describe :: String -> [(String, Int)] -> String
describe name ages = undefined -- write this: "adult" if found with age >= 20, "minor" if found otherwise, "unknown" if not found
describeを、caseやifを使わずガードだけで書いてください。lookupは1回だけ書くこと。
Reference
describe :: String -> [(String, Int)] -> String
describe name ages
| Just age <- found, age >= 20 = "adult"
| Just _ <- found = "minor"
| otherwise = "unknown"
where
found = lookup name ages
ガードにはBool式だけでなく、パターン <- 式という「パターンガード」も書けます(Haskell 2010で標準入り)。マッチに失敗すれば次のガードへ進み、成功すれば束縛したageを,で続く条件でそのまま使えます。whereで束縛したfoundは、すべてのガードから参照できます。これは参考実装であり、唯一の正解ではありません。