Namaran

Code daily. Without assist.

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を、caseifを使わずガードだけで書いてください。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は、すべてのガードから参照できます。これは参考実装であり、唯一の正解ではありません。