[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"