------------------------------------------------------------------------------ -- -- Haskell: The Craft of Functional Programming -- Simon Thompson -- (c) Addison-Wesley, 1999. -- -- Chapter 3 -- ------------------------------------------------------------------------------ module Chapter3 where -- The import statement which follows hides certain of the Prelude functions -- so that they can be given the definitions they have in their book. import Prelude hiding (max,toUpper,isDigit) -- The Booleans. -- ^^^^^^^^^^^^^ -- Exclusive or: this gives the result True if one of its arguments is True and -- the other False, and gives the result False in other cases. exOr :: Bool -> Bool -> Bool exOr x y = (x || y) && not (x && y) -- Using literals instead of variables in a definition; a simple example of -- pattern matching to give another definition of `not', ... myNot :: Bool -> Bool myNot True = False myNot False = True -- ... and of `exclusive or'. exOr1 True x = not x exOr1 False x = x -- Integers and guards. -- ^^^^^^^^^^^^^^^^^^^^ -- A to test whether three Ints are equal. threeEqual :: Int -> Int -> Int -> Bool threeEqual m n p = (m==n) && (n==p) -- The maximum of two integers; this is already defined in the Prelude, -- so its definition is hidden by the import statement at the top of this file. max :: Int -> Int -> Int max x y | x >= y = x | otherwise = y -- The maximum of three integers. maxThree :: Int -> Int -> Int -> Int maxThree x y z | x >= y && x >= z = x | y >= z = y | otherwise = z -- An alternative definition of max which uses if ... then ... else ... max' :: Int -> Int -> Int max' x y = if x >= y then x else y -- Characters. -- ^^^^^^^^^^^ -- Converting lower-case letters to upper-case; does something odd if you apply -- it to anythig else: how would you modify it to return anything else -- unchanged? toUpper :: Char -> Char toUpper ch = chr (ord ch + offset) offset = ord 'A' - ord 'a' -- A check whether a character is a digit (already defined in the Prelude) isDigit :: Char -> Bool isDigit ch = ('0' <= ch) && (ch <= '9') -- Some syntax. -- ^^^^^^^^^^^^ -- Layout: two definitions on one line, separated by a `;'. answer = 42 ; facSix = 720 -- Adding two integers: you can use longer names for variables than x and y! addTwo :: Int -> Int -> Int addTwo first second = first+second -- Defining an operators for yourself: another version of max! (&&&) :: Int -> Int -> Int x &&& y | x > y = y | otherwise = x