2. Pattern matching and basic types in Haskell

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:

f [] = ...
f (h:t) = ...

(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:

2.1.1. Write a function which returns the number of elements from a list. Use patterns.

2.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]).

2.1.3 (!) Write the same function, this time using only the cons (:) operator as well as patterns.

2.1.4. Write a function which removes duplicates from a list of integers.

2.2.1. What are the types of x,y,z,w and that of l in the implementation below?

f (x:y:z:w:l) = w
f _ = 0

How about:

f (x:y:z:w:l) = w

What is the difference?

2.2.2. What is the type of the function:

f x y = (x,y)

In the body of a function definition, , is a base constructor for pairs. The following are pairs: (1,2), (“Matei”,20), ([1,2],3). Note that there is no restriction on the type of the first and second values of a pair.

2.2.3. What is the type of the function:

f 'a' _ = []
f x y = x:y

In Haskell, the type String is equivalent to [Char] (hence strings are lists of chars). Strings can be introspected using patterns just like any other list.

2.2.4. Let f be the function below:

    f "321CB" [("321CB", ["Matei", "Andrei", "Mihai"]), ("322CB",["George", "Matei"])] = ["Matei", "Mihai"]

What is the signature of f?

2.3.1. Write a function which takes a list of words and makes the first letter of each word uppercase.

2.3.2. Write a function which takes a list of words and makes all letters uppercase.

2.3.3. (!) Write a function which takes a text and a pattern and returns the number of occurrences of the pattern in the text. Example:

search "I eat green apples" "eat" = 1
search "ababaab" "aba" = 2

2.3.4. (!) What does f, defined in exercise 2.2.4., do (note that Matei and Mihai both start with letter 'M')? Write an implementation for f.

2.3.5. Write the signature and implement the following function:

   f ["Matei", "Mihai"] ["Popovici","Dumitru"] = [("Matei","Popovici"), ("Mihai","Dumitru")]

2.3.6. Implement the following function:

   f ["Matei", "Mihai"] ["Popovici","Dumitru"] = ["MPopovici", "MDumitru"]

2.3.7. Write a function which takes a list of pairs - student-name and grade, removes those with grades less than 5, splits the name in substrings, and adds one bonus point to people with three names. Example:

    f [("Dan Matei Popovici",9),("Mihai",4),("Andrei Alex",6)] =
    	[(["Dan", "Matei", "Popovici"],10),(["Andrei", "Alex"],6)]