
	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

