
	Haskell: The Craft of Functional Programming
	Simon Thompson
	(c) Addison-Wesley, 1999.

	Chapter 13

>	module Chapter13 where

Checking types
^^^^^^^^^^^^^^

Non-type-correct definitions are included as comments.

>	example1 = ord 'c' + 3

	example2 = ord 'c' + False

	f n     = 37+n
	f True  = 34

	g 0 = 37
	g n = True

	h x 
	  | x>0         = True
	  | otherwise   = 37

	k x = 34
	k 0 = 35


Polymorphic type checking
^^^^^^^^^^^^^^^^^^^^^^^^^

Examples without their types; use Hugs to find them out.

>	f (x,y) = (x , ['a' .. y])

>	g (m,zs) = m + length zs

>	h = g . f

>	expr :: Int
>	expr = length ([]++[True]) + length ([]++[2,3,4]) 

The funny function does not type check.

	funny xs = length (xs++[True]) + length (xs++[2,3,4])


Type checking and classes
^^^^^^^^^^^^^^^^^^^^^^^^^

Membership on lists

>	member :: Eq a => [a] -> a -> Bool

>	member []     y = False
>	member (x:xs) y = (x==y) || member xs y

Merging ordered lists.

>	merge (x:xs) (y:ys) 
>	  | x<y         = x : merge xs (y:ys)
>	  | x==y        = x : merge xs ys
>	  | otherwise   = y : merge (x:xs) ys
>	merge (x:xs) []    = (x:xs)
>	merge []    (y:ys) = (y:ys)
>	merge []    []     = []

