• API
• FAQ
• Tools
• Archive
SHARE
TWEET

# OCAML / CS3110 / Date-like Tuples

a guest Jun 20th, 2019 89 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
1. (*
2. Define a date-like triple to be a value of type int*int*int. Examples of date-like triples
3. include (2013, 2, 1) and (0,0,1000). A date is a date-like triple whose first part is a
4. positive year (i.e., a year in the common era), second part is a month between 1 and 12,
5. and third part is a day between 1 and 31 (or 30, 29, or 28, depending on the month and year).
6. (2013, 2, 1) is a date; (0,0,1000) is not.
7.
8. Write a function is_before that takes two dates as input and evaluates to true or false.
9. It evaluates to true if the first argument is a date that comes before the second argument.
10. (If the two dates are the same, the result is false.)
11.
12. Your function needs to work correctly only for dates, not for arbitrary date-like triples.
13. However, you will probably find it easier to write your solution if you think about making
14. it work for arbitrary date-like triples. For example, it's easier to forget about whether
15. the input is truly a date, and simply write a function that claims (for example) that
16. January 100, 2013 comes before February 34, 2013â€”because any date in January comes before
17. any date in February, but a function that says that January 100, 2013 comes after
18. February 34, 2013 is also valid. You may ignore leap years.
19. *)
20. let is_before a b  =
21.     let ayear, amonth, aday = a in
22.     let byear, bmonth, bday = b in
23.     ayear < byear ||
24.     (ayear = byear && amonth < bmonth) ||
25.     (ayear = byear && amonth = bmonth && aday < bday)
26.
27.
28. (*
29. Write a function earliest : (int*int*int) list -> (int*int*int) option. It evaluates
30. to None if the input list is empty, and to Some d if date d is the earliest date in
31. the list. Hint: use is_before.
32.
33. As in the previous exercise, your function needs to work correctly only for dates,
34. not for arbitrary date-like triples.
35. *)
36. let  earliest l =
37.     let rec f d l' =
38.         match l' with
39.         | [] -> d
40.         | d' :: ds ->
41.             if is_before d d' then
42.                 f d ds
43.             else
44.                 f d' ds
45.     in
46.     match l with
47.     | [] -> None
48.     | d :: ds -> Some (f d ds)
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy.
Not a member of Pastebin yet?