Jane Street OCaml Challenge: Records

Records in OCaml are named collections of fields, similar to structs or classes in other languages.

Defining and Using a Record

type person = { age : int; first_name : string; last_name : string; number_of_cars : int; } [@@deriving compare] let an_example : person = { first_name = "Cotton-eyed"; last_name = "Joe"; age = 22; number_of_cars = 0; } let age : int = an_example.age let () = assert (age = 22)

Pattern Matching and Field Access

let print_info {first_name; last_name; age; number_of_cars} = Stdio.print_endline first_name; Stdio.print_endline last_name; Stdio.printf "Age: %d, # of cars: %d\n" age number_of_cars let print_name {first_name; last_name; age = _; number_of_cars = _} = Stdio.print_endline first_name; Stdio.print_endline last_name

Functional Record Updates

Use with to copy and update fields:

let add_one_to_age person = { person with age = person.age + 1 } let () = assert ((add_one_to_age an_example).age = 23)

Your Turn: Modify a Person

If first_name = "Jan", return a new person with age set to 30. Otherwise, increase number of cars by 6.

let modify_person (person : person) = failwith "For you to implement"

Tests

module For_testing = struct let test_ex1 : person = { first_name = "Jan"; last_name = "Saffer"; age = 55; number_of_cars = 0; } let test_ex1' : person = {test_ex1 with age = 30} let test_ex2 : person = { first_name = "Hugo"; last_name = "Heuzard"; age = 4; number_of_cars = 55; } let test_ex2' : person = { test_ex2 with number_of_cars = 61 } let%test "Testing modify_person..." = [%compare.equal: person] test_ex1' (modify_person test_ex1) let%test "Testing modify_person..." = [%compare.equal: person] test_ex2' (modify_person test_ex2) end