by shigemk2

当面は技術的なことしか書かない

型シノニム

[Char] と Stringは同値で、交換可能である。
これは型シノニム(型同義名)を使って実装されている

-- ロッカーが埋まっているか空いているかを表す新しいデータ型
-- LockerStateを導入。また、ロッカーの暗証番号には型シノニムCodeを与えた。
-- さらに整数から「ロッカーの状態や暗証番号の組」へのMapにも型シノニム
-- LockerMapを与える

import qualified Data.Map as Map
data LockerState = Taken | Free deriving (Show, Eq)
type Code = String
type LockerMap = Map.Map Int (LockerState, Code)


-- 続いて、ロッカーを表すMapから暗唱番号を検索する関数を作る
-- この関数の結果はEither String Code型で表すこととする

lockers :: LockerMap
lockers = Map.fromList
          [(100, (Taken, "ZD39I"))
          , (102, (Taken, "ZJHAI"))
          , (104, (Free, "ZJH8I"))
          , (106, (Free, "ZSHII"))
          , (108, (Free, "ZLQNI"))
          , (110, (Taken, "Z8LNI"))
          ]

lockerLookup :: Int -> LockerMap -> Either String Code
lockerLookup lockerNumber map = case Map.lookup lockerNumber map of
  Nothing -> Left $ "Locker " ++ show lockerNumber
                    ++ "doesn't exist!"
  Just (state, code) -> if state /= Taken
                        then Right code
                        else Left $ "Locker " ++ show lockerNumber
                             ++ " is already taken!"



-- *Main> lockerLookup 100 lockers
-- Left "Locker 100 is already taken!"
-- *Main> lockerLookup 102 lockers
-- Left "Locker 102 is already taken!"
-- *Main> lockerLookup 101 lockers
-- Left "Locker 101doesn't exist!"
-- *Main> lockerLookup 104 lockers
-- Right "ZJH8I"
-- *Main> lockerLookup 108 lockers
-- Right "ZLQNI"