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