## Description

**Problem 1:**

**———-**

**Implement the following functions:**

**a) filterFirst :: (a -> Bool) -> [a] -> [a]**

**so that filterFirst p xs removes the first element of xs which does not**

**satisfy the property p. For instance,**

**filterFirst even [1,2,3,4] ~~> [2,3,4]**

**b) filterLast :: (a -> Bool) -> [a] -> [a]**

**so that filterLast p xs removes the last element of xs which does not**

**satisfy the property p. For instance,**

**filterLast even [1,2,3,4] ~~> [1,2,4]**

**c) split :: [a] -> ([a],[a])**

**so that split will split a list into two lists, picking elements **

**alternately. For instance,**

**split [1,2,3,0,4] ~~> ([1,3,4],[2,0])**

**d) interleave :: ([a],[a]) -> [a]**

**so that interleave will interleave two lists. For instance,**

**interleave ([1,3,4],[2,0]) ~~> [1,2,3,0,4]**

**e) merge :: (Ord a) => ([a],[a]) -> [a]**

**so that merge merges two sorted lists to produce a sorted list. **

**For instance,**

**merge ([1,2,3],[4,5]) = [1,2,3,4,5]**

**f) mergeSort :: (Ord a) => [a] -> [a]**

**so that it realizes the mergesort algorithm. You have to use your **

**functions split (c) and merge (e).**

**Problem 2**

**———**

**a) Implement the functions **

**option :: RegExp -> RegExp**

**plus :: RegExp -> RegExp**

**where option e matches zero or one occurrence of the pattern e, and **

**plus e matches one or more occurrences of the pattern e.**

**b) Define regular expressions which match**

**– strings of digits which begin with a non-zero digit**

**– fractional numbers: two strings of digits separated by ‘.’;**

**make sure that these numbers have no superfluous zeros at the beginning or**

**at the end, so exclude strings like “01.34” and “1.20”**

**These are the exercises 12.16 and 12.17 of the book “Haskell – the craft**

**of functional programming” by Simpson Thompson (Third edition)**

**http://www.haskellcraft.com/**