我正在通过Learn you a haskell book,在第8章有一段代码看起来像这样
data LockerState = Taken | Free deriving (Eq, Show)
type Code = String
type LockerMap = Map.Map Int (LockerState, Code)
lookup' :: Int -> LockerMap -> Either String Code
lookup' num_ map_ =
case (Map.lookup num_ map_) of
Nothing -> Left $ "LockerNumber doesn't exist!"
Just (state, code) -> if state == Taken
then Left $ "LockerNumber already taken!"
else Right $ code
这行得通。但是,我想将 if/else 块转换为这样的保护语句:
lookup' :: Int -> LockerMap -> Either String Code
lookup' num_ map_ =
case (Map.lookup num_ map_) of
Nothing -> Left $ "LockerNumber doesn't exist!"
Just (state, code) ->
| state == Taken = Left $ "LockerNumber already taken!"
| otherwise = Right $ Code
这不编译。似乎 Haskell 中守卫的使用非常严格/不直观。SO Ex1 SO Ex2。有没有我可以阅读的明确来源告诉我可以在哪些地方使用警卫?