了解Haskell Map.lookup(LYH中的示例)

时间:2015-12-14 12:22:14

标签: haskell

我很感激帮助理解map中额外Map.lookup lockerNumber map的来源,来自以下Learn You a Haskell for Great Good

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

2 个答案:

答案 0 :(得分:1)

该代码中没有“额外”map(如map :: (a -> b) -> [a] -> [b]中所述)。如果我们将map重命名为m,则会更清楚:

lockerLookup :: Int -> LockerMap -> Either String Code  
lockerLookup lockerNumber m =   
    case Map.lookup lockerNumber m of   
      -- snip

现在您只需要记住Map.lookup类型为Ord k => k -> Map k a -> Maybe a,因此您需要提供Map。幸运的是,第二个参数(m)是LockerMap,与Map Int (LockerState, Code)相同。

答案 1 :(得分:1)

简而言之,此处mapLockerMap类型的变量,我假设其形式为Data.Map.Map someKeyType someValueType。它表示someKeyType的元素与someValueType的元素之间的(有限)关联。这有时也称为(有限)映射,(有限)函数,字典,散列等。

表达式Map.lookup x map只需访问键值map的{​​{1}}即可。结果是x Nothingxmap没有关联,Just v如果x与值v相关联。< / p>