99 Ocaml Problems
- #1 Tail of a list
- #2 Last two elements of a list
- #3 N'th element of a list
- #4 Find the number of elements of a list.
- #5 Reverse a list.
- #6 Palindrome
- #7 Flatten a list
#1 Tail of a list
Write a function last : 'a list -> 'a option
that returns the last element of a
list
# last ["a" ; "b" ; "c" ; "d"];;
- : string option = Some "d"
# last [];;
- : 'a option = None
Solution
let rec last = function
| [] -> None
| [x] -> Some x
| _::xs -> last xs
#2 Last two elements of a list
Find the last but one (last and penultimate) elements of a list.
# last_two ["a"; "b"; "c"; "d"];;
- : (string * string) option = Some ("c", "d")
# last_two ["a"];;
- : (string * string) option = None
Solution
let rec last_two = function
| [] | [_] -> None
| [x;y] -> Some (x,y)
| _::xs -> last_two xs
#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.
# List.nth ["a"; "b"; "c"; "d"; "e"] 2;;
- : string = "c"
# List.nth ["a"] 2;;
Exception: Failure "nth".
Solution
let rec nth index = function
| [] -> failwith "nth"
| x::xs -> if index = 0 then x else nth (index - 1) xs
#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.
# length ["a"; "b"; "c"];;
- : int = 3
# length [];;
- : int = 0
Solution
let length list =
let rec length_rec acc = function
| [] -> acc
| _::xs -> length_rec (acc + 1) xs
in length_rec 0 list
#5 Reverse a list.
OCaml standard library has List.rev but we ask that you reimplement it.
# rev ["a"; "b"; "c"];;
- : string list = ["c"; "b"; "a"]
Solution
let rev (list: int list) =
let rec rev acc = function
| [] -> acc
| x::xs -> rev (x::acc) xs
in rev [] list
#6 Palindrome
Find out whether a list is a palindrome.
HINT: a palindrome is its own reverse.
# is_palindrome ["x"; "a"; "m"; "a"; "x"];;
- : bool = true
# not (is_palindrome ["a"; "b"]);;
- : bool = true
Solution
let is_palindrome list = list = List.rev list
#7 Flatten a list
Flatten a nested list structure.
type 'a node =
| One of 'a
| Many of 'a node list
# flatten [One "a"; Many [One "b"; Many [One "c" ;One "d"]; One "e"]];;
- : string list = ["a"; "b"; "c"; "d"; "e"]
Solution
let flatten nodes =
let rec f = function
| One x -> [x]
| Many xs -> List.concat_map f xs
in nodes |> List.concat_map f
(* Or without List.concat_map *)
let flatten2 nodes =
let rec f acc = function
| [] -> acc
| One n::ns -> f (n::acc) ns
| Many ns::rest -> f (f acc ns) rest
in f [] nodes |> List.rev
Description
Languages
Org
100%