Tuesday,  June 3, 2003

11.15 a.m. – 12.30 p.m.

University of Glasgow

DEGREES OF M.Eng., B.Eng., B.Sc., M.A. and M.A. (Social Sciences)

COMPUTING SCIENCE 2S
FUNCTIONAL PROGRAMMING 2

(Answer all 6 questions.)


1.Evaluate the following Haskell expressions, giving a value and type.  If the expression is an error, explain why.

 

                                    (i)         [‘a’,’b’] ++ “cde”

                                    (ii)        head [[42,15],[19,10,13]]

                                    (iii)       tail [42,15]:[22]

                                    (iv)       (2,4):[(6,80)]

                                    (v)        fold ++ 0 [“hello”,”world”]

                                    (vi)       [x*2| x<- [1..10]

                                    (vii)      [(x,y)| x<-[1..3],y <- “ab”]

                                    (viii)      foldr * 0 [4,5,6]

                                    (ix)       fold ++ [“hello”,”world”]

                                    (x)        f 10 where f x y = x * y

                                    (xi)       g “3” where g x = x:”45”

(xii)             [3| x <- [1..3]]

[15]

 

2.               Define a Haskell type for a binary search tree, and then define the following functions on binary search trees.

 

a)      Insert an item into a binary search tree, avoiding duplication.

b)      Return the total number of items in a binary search tree.

c)      List the items in the binary search tree, in descending order.

[15]

 

3.               Given the following Haskell type for Integer binary trees:

 

                  data Tree = Nil | Node Int Tree Tree

                  define the following functions (including the type of function)

 

a)      sumtree, which returns the sum of the integers in a tree

b)      double, which doubles all the integers in a tree.

 

                  Then prove the following theorem by induction:

c)      for all finite binary trees t. ( sumtree t) * 2 = sumtree (double t).

 

                  Justify every step of your proof.


 

[15]

 

4.                              Deduce Haskell types for the following functions.

 

(a)                f x y (z:zs) = (y (x+z)) : f x y zs

(b)               f x y w z = foldr x y (z:w)

[15]

 

5.               Give a definition of the Haskell function foldr which applies a binary operator all elements of a lists and a “stopping” value.

[15]

 

                   6. Define a Haskell algebraic type to represent course modules.  Each module has the following attributes: the module name, the number of students taking the module, and a list of matric numbers of the students who have passed the module.

 

(a)    Define a function passboth which, for given modules x and y,  returns the number of students who have passed both modules x and y.

(b)   Define a function passeither which, for given modules x and y,  returns the number of students who have passed either module x or module y. The list should not contain duplicates.

(c)    Define a function passrate which, for given modules x and y, returns the proportion of students who have passed either module x or module y.

[15]