# Homework1 5100379002. What we have learnt Variable binding: val x = e; Conditionals: if e1 then e2 else e3 Function binding:fun x0 (x1 : t1,..., xn :

## Presentation on theme: "Homework1 5100379002. What we have learnt Variable binding: val x = e; Conditionals: if e1 then e2 else e3 Function binding:fun x0 (x1 : t1,..., xn :"— Presentation transcript:

Homework1 5100379002

What we have learnt Variable binding: val x = e; Conditionals: if e1 then e2 else e3 Function binding:fun x0 (x1 : t1,..., xn : tn) = e Tuples: – val tuple = (1, bool, a) – #1 tuple

What we have learnt Lists: – val xs = [e1, e2, …, en] – e1 :: xs – null xs – hd xs – tl xs

What we have learnt Let expressions: – let b1 b2... bn in e end Options: – NONE / SOME e – isSome – valOf Others: – andalso / orelse – e1 = e2 / e1 <> e2 / ~1

Problem1 fun is_older (pr1 : int * int * int, pr2: int * int * int) : bool fun is_older (pr1 : int * int * int, pr2: int * int * int) = (#1 pr1 < #1 pr2) orelse ( (#1 pr1 = #1 pr2) andalso (#2 pr1 < #2 pr2) ) orelse ( (#1 pr1 = #1 pr2) andalso (#2 pr1 = #2 pr2) andalso (#3 pr1 < #3 pr2))

Problem2 fun number_in_month (dates: (int * int * int) list,month: int ): int fun number_in_month(dates: (int*int*int) list, month: int) = if null dates then 0 else if #2 (hd dates) = month then 1 + number_in_month(tl dates, month) else number_in_month(tl dates, month)

Problem3 fun number_in_months (dates : ( int * int * int ) list, months : int list) : int fun number_in_months(dates: (int*int*int) list, months: int list) = if null months then 0 else number_in_month(dates, hd months) + number_in_months(dates, tl months)

Problem4 fun dates_in_month(dates: (int*int*int) list, month: int): (int*int*int) list fun dates_in_month (dates : ( int * int * int ) list, month : int) = if null dates then [] else if #2 (hd dates) = month then (hd dates) :: dates_in_month ( (tl dates), month) else dates_in_month ( (tl dates), month)

Problem5 fun dates_in_months (dates : ( int * int * int ) list, months : int list) : ( int * int * int ) list fun dates_in_months (dates : ( int * int * int ) list, months : int list) = if null months then [] else dates_in_month (dates, hd months) @ dates_in_months (dates, tl months)

Problem6 fun get_nth(strings: string list, n: int):string fun get_nth(strings: string list, n: int) = if n = 1 then hd strings else get_nth(tl strings, n-1)

Problem7 fun date_to_string ( date : int * int * int): string fun date_to_string ( date : int * int * int) = let val months_name = ["January", "February", "March", "April", "May", "June, "July", "August", "September", "October", "November", "December"] in get_nth (months_name, #2 date) ^ ^ Int.toString (#3 date) ^ ", " ^ Int.toString (#1 date) end

Problem8 fun number_before_reaching_sum(sum: int, numbers: int list):int fun number_before_reaching_sum(sum: int, numbers: int list) = let fun count(numbers: int list, acc: int, n: int) = if hd numbers + acc >= sum then n else count(tl numbers, acc + hd numbers, n + 1) in count(numbers, 0, 0) end

Promblem9 fun what_month (day_of_year : int): int fun what_month(day_of_year: int) = let val days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] in number_before_reaching_sum(day, days_in_month) + 1 end

Problem10 fun month_range(day1: int, day2: int): int list fun month_range(day1: int, day2: int) = if day1 > day2 then [] else what_month(day1) :: month_range(day1 + 1, day2)

Problem11 fun oldest(dates: (int*int*int) list):(int*int*int) option fun oldest(dates: (int*int*int) list) = if null dates then NONE else let val tl_ans = oldest(tl dates) in if isSome tl_ans andalso is_older(valOf tl_ans, hd dates) then tl_ans else SOME (hd dates) end

Challenge Problem 1 fun number_in_months_challenge (dates : ( int * int * int ) list, months : int list) : int fun number_in_months_challenge (dates : ( int * int * int ) list, months : int list) = if null months then 0 else number_in_months (dates, remove_duplicates(months))

fun remove_duplicates (months : int list) = let fun exists (n : int, ls : int list) = if null ls then false else (n = (hd ls) orelse exists(n, tl ls)) in if null months then [] else if exists(hd months, tl months) then remove_duplicates (tl months) else (hd months) :: remove_duplicates(tl months) end

fun dates_in_months_challenge (dates : ( int * int * int ) list, months : int list) = if null months then [] else dates_in_months (dates, remove_duplicates(months))

Challenge Problem2

fun reasonable_date (date : int * int * int) = let val year = #1 date val month = #2 date val day = #3 date val valid_year = year > 0 val valid_month = (month >= 1) andalso (month <= 12) val is_leap_year = (year mod 400 = 0) orelse ((year mod 4 = 0) andalso (year mod 100) <> 0) ……

val val_for_Feb = if is_leap_year then 29 else 28 val days = [31, val_for_Feb, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] fun get_nth_int (ls : int list, n : int) = if n = 1 then hd ls else get_nth_int (tl ls, (n-1)) val valid_day = valid_month andalso ((#3 date) <= get_nth_int(days, #2 date)) andalso ((#3 date) >= 1); in ……

in valid_year andalso valid_month andalso valid_day end

Q & A

Download ppt "Homework1 5100379002. What we have learnt Variable binding: val x = e; Conditionals: if e1 then e2 else e3 Function binding:fun x0 (x1 : t1,..., xn :"

Similar presentations