我很感激帮助理解map
中额外Map.lookup lockerNumber map
的来源,来自以下Learn You a Haskell for Great Good
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!"
答案 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)
简而言之,此处map
是LockerMap
类型的变量,我假设其形式为Data.Map.Map someKeyType someValueType
。它表示someKeyType
的元素与someValueType
的元素之间的(有限)关联。这有时也称为(有限)映射,(有限)函数,字典,散列等。
表达式Map.lookup x map
只需访问键值map
的{{1}}即可。结果是x
Nothing
中x
与map
没有关联,Just v
如果x
与值v
相关联。< / p>