Gli esercizi con flag (*) sono particolarmente impegnativi.
Esercizi sulle liste:
length: 'a list → int
, restituisce la lunghezza di una lista.count: 'a → 'a list → int
, conta le occorrenze di un elemento in una lista rev: 'a list → 'a list
, rovescia una lista.append : 'a list → 'a list → 'a list
, concatena due liste.Esercizi sui tipi varianti (tagged unions):
fib : int → int partial
che dato un intero n restituisca l’ennesimo numero di fibonacci se n>0
, None
altrimentitype seme = Picche | Cuori | Denari | Fiori ;; type carta = Carta of int * seme;; type mazzo = Mazzo of carta list;;
ad esempio, un mazzo sara’ una lista di elementi di tipo carta:
let Mazzo = [Carta (1, Picche); Carta (1, Cuori); Carta (1, Denari); Carta (1, Fiori); Carta (2, Picche); Carta (2, Cuori).....]
Non tutti i valori di tipo carta rappresentano una carta da gioco, ma solo quelli il cui numero e’ compreso tra 1(Asso) e 10 (Re). Ad esempio la funzione 'is_card_correct
' restituisce true se la carta e’ corretta.
let is_card_correct (Carta (n,s)) = n>=1 && n<=10;;
Scrivere le seguenti funzioni su un mazzo di carte:
is_complete : mazzo → bool
, dice se un mazzo e’ corretto e completo (se e’ composto da 40 carte tutte diverse e tutte valide)new_mazzo: unit → mazzo
, crea un nuovo e valido mazzo di carte. (nota: non e’ permesso enumerare tutte le carte)partition : mazzo → mazzo * mazzo * mazzo * mazzo
, partiziona il mazzo in quattro mazzi composti dalle carte dello stesso seme.