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

	Chapter 11

>	module Chapter11 where

Program development
^^^^^^^^^^^^^^^^^^^

Development in practice
^^^^^^^^^^^^^^^^^^^^^^^
Defining the .. notation (not executable code).

[m .. n]
  | m>n         = []
  | otherwise   = m : [m+1 .. n]

[1 .. n] 
  | 1>n         = []
  | otherwise   = [1 .. n-1] ++ [n]

A simple palindrome check.

>	simplePalCheck :: String -> Bool
>	simplePalCheck st = (reverse st == st)

The full check

>	palCheck = simplePalCheck . clean

where the clean function combines mapping (capitals to smalls) and
filtering (removing punctuation)

>	clean :: String -> String 

>	clean = map toSmall . filter notPunct

>	toSmall  = toSmall	-- dummy definition
>	notPunct = notPunct	-- dummy definition

Auxiliary functions
^^^^^^^^^^^^^^^^^^^

When is one string a subsequence of another? 

>	subseq :: String -> String -> Bool

>	subseq []    _  = True
>	subseq (_:_) [] = False
>	subseq (x:xs) (y:ys)
>	  = subseq (x:xs) ys || frontseq (x:xs) (y:ys)

When is one strong a subsequece of another, starting at the front?

>	frontseq :: String -> String -> Bool
>	frontseq []     _  = True
>	frontseq (_:_)  [] = False
>	frontseq (x:xs) (y:ys)
>	  = (x==y) && frontseq xs ys


