23
Homework1 5100379002 冯冯冯

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 :

Embed Size (px)

Citation preview

Page 1: 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 :

Homework1

5100379002 冯云平

Page 2: 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 :

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

Page 3: 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 :

What we have learnt

• Lists: – val xs = [e1, e2, … , en]– e1 :: xs– null xs– hd xs– tl xs

Page 4: 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 :

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

Page 5: 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 :

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))

Page 6: 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 :

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

elseif #2 (hd dates) = month then 1 + number_in_month(tl dates, month)

else number_in_month(tl dates, month)

Page 7: 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 :

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 0else number_in_month(dates, hd months) +

number_in_months(dates, tl months)

Page 8: 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 :

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 datesthen []else

if #2 (hd dates) = monththen (hd dates) :: dates_in_month ( (tl dates), month)else dates_in_month ( (tl dates), month)

Page 9: 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 :

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 monthsthen []else dates_in_month (dates, hd months) @ dates_in_months

(dates, tl months)

Page 10: 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 :

Problem6

• fun get_nth(strings: string list, n: int):string

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

Page 11: 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 :

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

Page 12: 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 :

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 >= sumthen n

else count(tl numbers, acc + hd numbers, n + 1)in

count(numbers, 0, 0)end

Page 13: 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 :

Promblem9

• fun what_month (day_of_year : int): int

fun what_month(day_of_year: int) =letval days_in_month = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]innumber_before_reaching_sum(day, days_in_month) + 1

end

Page 14: 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 :

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)

Page 15: 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 :

Problem11• fun oldest(dates: (int*int*int) list):(int*int*int)

option

fun oldest(dates: (int*int*int) list) =if null datesthen NONEelse letval tl_ans = oldest(tl dates)inif isSome tl_ans andalso is_older(valOf tl_ans, hd dates) then tl_anselse SOME (hd dates)end

Page 16: 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 :

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 monthsthen 0else number_in_months (dates,

remove_duplicates(months))

Page 17: 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 :

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))

inif null monthsthen []else

if exists(hd months, tl months)then remove_duplicates (tl months)else (hd months) :: remove_duplicates(tl months)

end

Page 18: 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 :

fun dates_in_months_challenge (dates : ( int * int * int ) list, months : int list) =

if null monthsthen []else dates_in_months (dates,

remove_duplicates(months))

Page 19: 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 :

Challenge Problem2

Page 20: 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 :

fun reasonable_date (date : int * int * int) = let

val year = #1 dateval month = #2 dateval day = #3 date

val valid_year = year > 0val 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)

……

Page 21: 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 :

……val val_for_Feb = if is_leap_year then 29 else 28val 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 = 1then hd lselse 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

……

Page 22: 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 :

……in

valid_year andalso valid_month andalso valid_day

end

Page 23: 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 :

• Q & A