-- Comp1100 Sem 1 2006
-- Patterns and Higher-Order Functions
-- Examples for lecture
-- Clem Baker-Finch March 2006

module FilterDemo where

import Prelude hiding (filter)
import Data.Char  -- for isDigit

-- Examples showing common pattern --

-- Select the digits from a string

getDigits :: String -> String
getDigits [] = []
getDigits (x:xs)
    | isDigit x  = x : getDigits xs
    | otherwise  =     getDigits xs

-- Select the negative numbers from a list

getNegs :: [Int] -> [Int]
getNegs [] = []
getNegs (x:xs)
    | x < 0      = x : getNegs xs
    | otherwise  =     getNegs xs

-- The standard definition of filter --

filter   :: (a -> Bool) -> [a] -> [a]
filter p []    = []
filter p (x:xs)
    | p x        = x : filter p xs
    | otherwise  =     filter p xs

-- Equivalent definitions using filter

getDigits' xs = filter isDigit xs

getNegs' xs   = filter (< 0) xs

-- In fact there is no need for xs argument in definition

getDigits'' = filter isDigit

getNegs''   = filter (< 0)

