(* Should Evaluate to 65 *)

let rec fact (n:int) : int =
if 0 < n then n + (fact (n-1))
else 0 in
let rec fact_list (n:int) : (int*int) list =
if 0 < n then (n, (fact n))::(fact_list (n-1))
else [] in
let rec add_up (l:(int*int) list) : int =
match l with
| [] -> 0
| hd::tl -> Fst(hd) * Snd(hd) + (add_up tl) in
add_up (fact_list 4)
