commit 894525b663205eb19a7b78aebd710bc0dc7546d8 Author: Joseph Ferano Date: Thu Dec 29 22:23:44 2022 +0700 First 3 problems diff --git a/README.org b/README.org new file mode 100644 index 0000000..35af0dd --- /dev/null +++ b/README.org @@ -0,0 +1,79 @@ +#+TITLE: 99 Ocaml Problems +#+Author: Joseph Ferano + +*** #1 - Tail of a list + +Write a function ~last : 'a list -> 'a option~ that returns the last element of a +list + +#+begin_src ocaml +# last ["a" ; "b" ; "c" ; "d"];; +- : string option = Some "d" + # last [];; +- : 'a option = None +#+end_src + +**** Solution +#+begin_src ocaml +let rec last = function + | [] -> None + | [x] -> Some x + | _::xs -> last xs +#+end_src + +*** #2 - Last two elements of a list + +Find the last but one (last and penultimate) elements of a list. + +#+begin_src ocaml +# last_two ["a"; "b"; "c"; "d"];; +- : (string * string) option = Some ("c", "d") +# last_two ["a"];; +- : (string * string) option = None +#+end_src + +**** Solution +#+begin_src ocaml +let rec last_two = function + | [] | [_] -> None + | [x;y] -> Some (x,y) + | _::xs -> last_two xs +#+end_src + +*** #3 - N'th element of a list + +Find the N'th element of a list. + +REMARK: OCaml has List.nth which numbers elements from 0 and raises an exception +if the index is out of bounds. + +#+begin_src ocaml +# List.nth ["a"; "b"; "c"; "d"; "e"] 2;; +- : string = "c" +# List.nth ["a"] 2;; +Exception: Failure "nth". +#+end_src + +**** Solution +#+begin_src ocaml +let rec nth index = function + | [] -> failwith "nth" + | x::xs -> if index = 0 then x else nth (index - 1) xs +#+end_src + +*** #4 Find the number of elements of a list. + +OCaml standard library has List.length but we ask that you reimplement it. Bonus for a tail +recursive solution. + +#+begin_src ocaml +# length ["a"; "b"; "c"];; +- : int = 3 +# length [];; +- : int = 0 +#+end_src + +**** Solution +#+begin_src ocaml + +#+end_src