ESERCIZI HASKELL
Esercizio 1
Definire in HASKELL il dato astratto "Tipo" (gli oggetti di questo tipo di dato astratto
rapresentano i tipi dei sistemi a' la Church e a' la Curry per il lambda-calcolo).
Esercizio 2
Supponete di aver definito una funzione Haskell di nome funct.
Dire cosa fa il sistema se si scrive:
type funct
Dire cosa avrebbe fatto il sistema se prima della definizione di funct uno avesse scritto:
funct :: [Int] -> Bool
Soluzione
Esercizio 3
Definire in HASKELL il tipo di dato astratto Albero binario etichettato con etichette
numeriche.
Soluzione
Esercizio 4
Definire in HASKELL il tipo di dato astratto Albero ternario senza etichette.
Soluzione
Esercizio 5
Definire in Haskell il tipo di dato Albero ternario etichettato.
Discutere brevemente la soluzione proposta.
Soluzione
Esercizio 6
In Haskell ogni termine, prima di venire valutato, viene tipato con un
sistema di assegnamento simile a quello a' la Curry visto nel corso.
I lambda termini tipabili
a' la Curry hanno la proprieta' di essere fortemente normalizzabili.
Questo dovrebbe implicare che ogni "programma" Haskell "termini".
Invece non e' cosi'.
Cosa e' presente in Haskell in piu', rispetto al sistema di assegnamento di tipi
a'la Curry per il lambda calcolo, che fornisce al linguaggio la possibilita'
di avere non terminazione?
Esercizio 7
Supponendo che non sia predefinito, definire in HASKELL il tipo di dato astratto
Lista di Interi. E' possibile definire il tipo di dato Lista di elementi qualsiasi?
Soluzione
Esercizio 8
Cosa ha a che fare il lambda-calcolo tipato a' la Curry con HASKELL? Discutere.
Esercizio 9
La sonda Spirit ha trovato che su Marte esistono i Loffioni.
Un Loffione puo' essere un Gangarone oppure un Sarrapone,
oppure una sequenza finita di Purpuroni.
Un Purpurone e' formato da un Gangarone e un Sarrapone.
In natura il numero di sarraponi e' infinito, invece esistono solo due Gangaroni,
il GangaroneA e il GangaroneB.
Definire in Haskell il tipo di dato astratto Loffione che possa permettere
di scrivere programmi Haskell che simulino esperimenti virtuali sui Loffioni.
Soluzione
Esercizio 10
Le seguente definizioni HASKELL
f n = n:(f(n+1))
nums = f 0
corrispondono, in SCHEME, a
(define (f n) (cons n (f (+ n 1))))
(define nums (f 0))
Che cosa "dovrebbe" fare f? e cosa e' nums?
Perche' in Haskell possiamo utilizzare f e nums (fornire possibilmente
un esempio di uso), mentre in SCHEME non ci possiamo fare in pratica niente?
Perche' comunque, anche se poi non ci possiamo fare un fico secco, SCHEME permette
lo stesso di definire la funzione f senza darci problemi?
Soluzione
Esercizio 11
Presa la seguente definizione di tipo in HASKELL
data Pirimpo = Pompero Int | Zumpo Pirimpo [Int]
scrivere delle definizioni Scheme che permettano di utilizzare
(per qual che e' possibile in Scheme) il tipo di dato Pirimpo.
Soluzione
Esercizio 12
Gli Yunz sono esseri magici che nella contea di Hargaar vengono
usati dagli studenti per passare gli esami.
Uno Yunz puo' venire generato dicendo due numeri qualsiasi mentre
si effettua l'incantesimo del mago Frunz su due Yunz. Il nanetto Yor e'
uno Yunz.
- Definire il tipo di dato Yunz in Haskell.
- Volendo utilizzare gli Yunz in Scheme, dire quali
costruttori, predicati e selettori bisogna definire (dire solo il nome
e gli argomenti delle funzioni che occorre definire)
- Affinche' uno studente possa trarre profitto dalla presenza
di uno Yunz, deve sapere se per generarlo e' mai stato utilizzato il
numero 276 durante l'incantesimo del mago Frunz. Definire un predicato
Scheme che serva a tale scopo.
Soluzione
Esercizio 13
Dire brevemente cosa fa' l'interprete HASKELL quando scriviamo qualcosa
del genere:
funct :: [Int] -> Bool
funct ls = BODY