Version: 5
Last modified: Wednesday, February 1, 20:40
Please be sure to be using Ocaml 3.12
Changes:
cond_dup
n_times
and
uses semicolons rather than commas in cond_dup
This problem set has three parts. You should
write your solution to each part in a separate file: part1.txt
,
part2.ml
, and part3.ml
. To help get you started,
we have provided a stub file for each part on CMS. You should download and
edit these files. Once you have finished, submit your solution using CMS,
linked from the course website.
Give the types of each of the following OCaml expressions. For
example, the type of (1, 2)
is int * int
.
[(3 , 4); (5, 6)]
(['a'], 'b')
[[None]]
fun f (z, v, t) -> if f z == "inf" && v t == "mar" then "win" else "lose"
char list option
bool -> 'a -> ('b -> 'a) -> 'b -> 'a
('a -> 'a) -> 'a -> 'a
char * int * float -> int * string -> int
Replace ???
with an expression that (1) makes the code
type check correctly and (2) does not cause the code to raise an
exception. Give the type of the expression you chose.
let num = ??? in let first = num / 100 in let second = num mod 100 in let third = first - second - second - second in let ans = first + second + third in if ans != 42 then failwith "argh"
let nums = ??? in let filterer zardoz = List.filter (fun x -> x > 0) zardoz in let splitter zardoz = let (a,b) = List.split zardoz in b in let zardoz = filterer (splitter nums) in if List.length zardoz = 0 then failwith "argh"
The following function executes correctly, but it was written with poor style. Rewrite it with better style. Please consult the CS 3110 style guide.
let rec zardoz f lst = if (List.length lst == 0) != false then [] else if (List.length lst == 1) == true && true
then [f (List.hd lst)] @ zardoz f [] else let hd = List.hd lst in let tl = List.tl lst in let v = f hd in let lstdv = [v] in let rest = zardoz f tl in lstdv @ rest
cond_dup : 'a list -> ('a -> bool) ->
'a list
that takes in a list and preciate and duplicates all
elements which satisfy the condition expressed in the predicate. For
example, cond_dup [3;4;5] (fun x -> x mod 2 = 1) = [3;3;4;5;5]
. n_times : ('a -> 'a) * int * 'a -> 'a
such that n_times (f,n,v)
applies f
to v n
times. For example, n_times((fun x-> x+1), 50, 0) = 50
.
range : int -> int -> int list
such that range num1 num2
returns an ordered list of all integers from num1
to num2
inclusive. For example, range 2 5 = [2;3;4;5]
. Use failwith if num2
< num1
. zipwith : ('a -> 'b -> 'c) -> 'a list -> 'b list -> 'c list
such that zipwith f l1 l2
generates a list whose ith element is obtained by applying f
to the ith element of l1
and the ith element of l2
. If the lists have different lengths, the extra elements in the longer list should be ignored. For example, zipwith (+) [1;2;3] [4;5] = [5;7]
.
let hyp a b = sqrt((a *. a ) +. (b *. b))
. The following code uses higher order functions to calculate the same value. Fill in the ??? below so that the whole function correctly calculate the hypotenuse of a right triangle.
let hyp a b = let d x = ??? in let u (x1, x2) f = ??? in let p f x = ??? in p sqrt (u (u (d a) ( *.), u (d b) ( *.)) (+.))
buckets : ('a -> 'a -> bool) ->
'a list -> 'a list list
that partitions a list into equivalence classes. That is,
buckets equiv lst
should return a list of lists where
each sublist in the result contains equivalent elements, where two
elements are considered equivalent if equiv
returns true. For example:
buckets (=) [1;2;3;4] = [[1];[2];[3];[4]] buckets (=) [1;2;3;4;2;3;4;3;4] = [[1];[2;2];[3;3;3];[4;4;4]] buckets (fun x y -> (=) (x mod 3) (y mod 3)) [1;2;3;4;5;6] = [[1;4];[2;5];[3;6]]