Őrminták és nézet minták

Őrminták

Használat:

-- {-# LANGUAGE PatternGuards #-}
showNumber xy
  | Just num <- lookup xy phoneBook
  = "Number: " ++ show num
  | otherwise
  = "No number found."
phoneBook = [("Bob",13),("Ruth",17)]
lookup :: Eq a => a -> [(a, b)] -> Maybe b

Összetett használat

-- f a b
--    | patt <- expr
--    , patt <- expr
--    , patt <- expr
--    = expr

Egy valós példa..

-- squareState st p 
--     | Just r        <- revealing st
--     , p == revSquare r
--     , Just i        <- busyAnimation r
--     = BusySign focused prelight i
--     | Just h        <- hint st
--     , Just max      <- maxHiddenProb g
--     , Just x        <- M.lookup p $ hiddenProbs g
--     , h == FullHint || x == max || x == 0 || marked'
--     = (if marked' then HintedBomb else Hint) focused prelight x
--     | marked'      
--     = Bomb focused prelight 
--     | Just Nothing  <- revealed
--     = Death
--     | Just (Just i) <- revealed
--     ...

Nézet minták

Használat:

-- {-# LANGUAGE ViewPatterns #-}

Tipikus használat

Adott egy adattípus:

data Square = Square Int Int

Szeretnénk absztrakttá tenni hogy optimalizálhassuk (egy Int-en ábrázolva)

Interfész készítés:

square :: Int -> Int -> Square
square = Square
xy :: Square -> (Int, Int)
xy (Square x y) = (x, y)

Tipikus használat (folytatás)

Ezután csak az interfész függvényeket használhatjuk, de nem akarunk lemondani a mintaillesztésről:

onBoard :: (Int, Int) -> Square -> Bool
onBoard (sx, sy) (xy -> (x, y))
      =  1 <= x && x <= sx 
      && 1 <= y && y <= sy

Skatulyázás

Skatulyázás példa:

playerX :: Board -> Int
playerX (playerPos -> (xy -> (x, y))) = x

ahol

playerPos :: Board -> Square
playerPos _ = square 0 0
type Board = ()

Aktív minta

Aktív minta példa:

onWhite :: Piece -> Board -> Bool
onWhite piece (colour piece -> White) = True
onWhite _ _ = False

ahol

data Colour = Black | White
colour :: Piece -> Board -> Colour
colour _ _ = White
type Piece = ()