Esercizi sulle liste:
let rec split n l = if n=0 then ([],l) else match l with [] -> ([],[]) | x::xl -> let (l1,l2) = split (n-1) xl in (x::l1,l2);; let rec merge (l1,l2) cmp = match (l1,l2) with ([],l2) -> l2 | (l1,[]) -> l1 | (x::x1,y::y2) -> if (cmp x y < 0) then x::(merge(x1,l2) cmp) else y::(merge(l1,y2) cmp);; let rec sort l cmp = match l with [] -> [] | [x] -> [x] | _ -> let (l1,l2) = (split ((length l) / 2) l) in merge (sort l1 cmp,sort l2 cmp) cmp;;
Esercizi sui tipi varianti (tagged unions):
type 'a partial = None | Some of ('a);; let rec fibR n = match n with 1 -> 1 |2 -> 1 |_ -> fibR (n-1) + fibR (n-2) ;; let fib n = match n with n when n<=0 -> None | n -> Some (fibR n);;
let partition (Mazzo l) = let seme_filter s = List.filter (fun (Carta(n,x)) -> x=s) in (Mazzo(seme_filter Picche l), Mazzo(seme_filter Cuori l), Mazzo(seme_filter Denari l), Mazzo(seme_filter Fiori l));;