Description
Q1 (a). [10 points] In this question you will write a program that takes two lists of the same length and returns a single list with the items paired together. This will be used in later questions in this assignment; we will need it with floating point items but your code should be polymorphic. The snippet below shows the function name, which you must use, and the type returned by the OCaml system. Your code must have this type. # let rec pairlists twolists = … val pairlists : ’a list * ’b list -> (’a * ’b) list = We will forbid the use of the List.combine library function that does the same thing. Test inputs are two int lists of the same length and we will check that you have handled the case of empty input lists. Here is an example showing the right way and the wrong way to use pairlists. # let l1 = [1;2;3];; val l1 : int list = [1; 2; 3] # let l2 = [’a’;’b’;’c’];; val l2 : char list = [’a’; ’b’; ’c’] # let p1 = pairlists (l1,l2);; val p1 : (int * char) list = [(1, ’a’); (2, ’b’); (3, ’c’)] # let e1 = pairlists l1 l2;; Characters 9-18: let e1 = pairlists l1 l2;; ^^^^^^^^^ Error: This function has type ’a list * ’b list -> (’a * ’b) list It is applied to too many arguments; maybe you forgot a ‘;’. 1 Q1 (b). [20 points] If (wi) is a sequence of weights and (vi) is a sequence of values we define the weighted mean or average by the formula mean = P P i wi ∗ vi i wi . In this question you are given two lists of floats as input. The first list is a list of weights and the second is the list of values. Implement a function wmean which calculates the weighted mean of the values with the given weights. Here is the declaration and the type that we expect and an example of using it. Note the type and the way that the function is used. # let wmean weights data = …. val wmean : float list -> float list -> float = # wmean [1.0;1.5;2.5;0.5;1.5] [10.3;11.7;2.0;5.0;6.5];; – : float = 6.44285714285714217 In order to do this you are required to use your pairlists function from Q1(a) and the sumlist function that we have provided. In this exercise we want you to learn to use the List.map function from the library; you are not allowed to use let rec in this exercise. We guarantee that we will not give you empty lists as test cases. Q2. [20 points] This question involves two simple exercises in list manipulation. In the first one you are given a pair: the first member of the pair is an item and the second member is a list of items of the same type as the first member. The output is a boolean that says whether the item is in the list or not. The second function takes a pair of an item and a list and returns a list with the item removed. If the item is not in the list then the same list is returned. You can use the first function in implementing the second but we are not requiring you to do so. Here are the declarations and types. # let rec memberof pair = … val memberof : ’a * ’a list -> bool = # let rec remove(item, lst) = … val remove : ’a * ’a list -> ’a list = # remove (3, [1;6;3;2;6;1;7;2;3;5]);; – : int list = [1; 6; 2; 6; 1; 7; 2; 5] The lists may contain duplicates; all copies should be removed. Make sure that you deal with empty lists. Here is an important style remark: never write if foo then true else false; this should just be foo. Q3. [20 points] In this question we want you to find the largest item in a list of integers. You can assume that the lists are nonempty. The top level declaration is nonrecursive because there is an internal recursive function. 2 # let find_max l = … val find_max : ’a list -> ’a = # find_max [1;6;3;2;6;1;7;2;3;5];; – : int = 7 Q4. [30 points] In this question we want you to use find_max and remove to implement a selection sort algorithm. You can assume that the list contains no duplicates. # let rec selsort l = val selsort : ’a list -> ’a list = # selsort [1;4;2;5;3;9;6;8;7];; – : int list = [9; 8; 7; 6; 5; 4; 3; 2; 1] You are not allowed to use built-in sorting functions. 3