Edit this page Backlinks This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ====== 3. Recursive functions and tail-end recursion ====== ===== 3.1. Pattern matching revisited ===== It is likely that in the above implementations you used ''head'' and ''tail'', or branch definitions combined with '_' to solve the exercises. Haskell supports a more elegant means of //value introspection//, called **pattern matching**. For instance, in: <code haskell> f [] = ... f (h:t) = ... </code> ''(h:t)'' is a **pattern** which denotes a non-empty list where ''h'' is the first element and ''t'' is the rest of the list. In fact, ''[]'' is also a pattern denoting the empty lists. Patterns are **allways** surrounded by round parentheses. They can also be composite, as in the exercise below: 3.1.1. Write a function which returns the number of elements from a list. Use patterns. 3.1.2. Write a function which takes a list of integer lists, and concatenates them. (E.g. ''f [ [1,2,3],[4,5] ] = [1,2,3,4,5]''). 3.1.3 (!) Write the **same** function, this time using only the **cons** ('':'') operator as well as **patterns**. Hint: <code haskell> [[1,2,3],[4,5]] = 1:[[2,3],[4,5]] = 1:2:[[3],[4,5]] = 1:2:3:[[],[4,5]] = 1:2:3:[[4,5]] = 1:2:3:4:[[5]] = 1:2:3:4:5:[[]] = 1:2:3:4:5:[] </code> 3.1.4. Write a function which removes duplicates from a list of integers. ===== 3.2. Tail-end recursive functions ===== 3.2.1 Solve exercise 3.1.3. using a tail-recursive function. 3.2.2. Solve exercise 3.1.4. using a tail-recursive function. 3.2.3. Return all duplicates from a list, using a tail-recursive function. E.g., the duplicates from list ''[1,2,3,4,2,4,2,1]'' are ''[2,4,2,1]''. ===== 3.3. Strings in Haskell ===== In Haskell, strings are implemented as **lists of type** ''Char''. For instance '''a' '' is a ''Char''. Also, the string ''"abc"'' is the same as: '' 'a':'b':'c':[]''. Strings can be introspected (using pattern matching) and constructed exactly as any other list (using cons '':'', ''++'', etc.). 3.3.1. Write a function which takes a list of words and makes the first letter of each word uppercase. (Hint: google a respective function of chars). 3.3.2. Write a function which takes a list of words and makes **all** letters uppercase. 3.3.3. (!) Write a function which takes a text and a pattern and returns the number of occurrences of the pattern in the text. Do **not** use auxiliary functions. Example: <code haskell> search "I eat green apples" "eat" = 1 search "ababaab" "aba" = 2 </code>