Mae向きなブログ

Mae向きな情報発信を続けていきたいと思います。

Making Our Own Types and Typeclasses

ここ最近は,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分探索木がいいですね(^^)。