ここ最近は,20世紀少年に没頭していました…。
さて,今日は「Learn You a Haskell for Great Good!」の
8. Making Our Own Types and Typeclasses
を斜め読みしてます。まだ読みかけです。
英語力が乏しいので,できるだけ実行させて試してみることを心がけているのですが,いろいろ難しい部分がありますね。
例えば,以下なんかは,納得できる部分もあるのですが,細かく見ていくと,case文が気になります。
import qualified Data.Map as Map data LockerState = Taken | Free deriving (Show, Eq) type Code = String type LockerMap = Map.Map Int (LockerState, Code) lockerLookup :: Int -> LockerMap -> Either String Code lockerLookup lockerNumber map = case Map.lookup lockerNumber map of Nothing -> Left $ "Locker number " ++ show lockerNumber ++ " does't exist!" Just (state, code) -> if state /= Taken then Right code else Left $ "Locker " ++ show lockerNumber ++ " is already taken!" lockers :: LockerMap lockers = Map.fromList [(100,(Taken,"ZD39I")) ,(101,(Free,"JAH3I")) ,(103,(Free,"IQSA9")) ,(105,(Free,"QOTSA")) ,(109,(Taken,"893JJ")) ,(110,(Taken,"99292")) ]
以下のように,実行したときに
Main> Map.lookup 100 lockers
(Taken,"ZD39I")
となります。僕は,「Just (Taken,"ZD39I")」となって,「Just (state, code)」とマッチして…と思ったのですが…,
また,以下を実行すると,「Nothing」ではなく,「Exception」となり自分の予想と違うなぁと思ってしまいます。
Main> Map.lookup 111 lockers
*** Exception: user error (Data.Map.lookup: Key not found)
「Recursive data structures」のところは,面白いですね。特に,2分探索木がいいですね(^^)。