Linguaggi di Programmazione (6 Marzo 2012)

Esercizio 1
(a) Monadi in Haskell. Definizione e loro utilizzo.

(b) Discutere brevemente della Tail Recursion.
Il seguente codice Haskell implementa l'insertion-sort parametrizzato sul un predicato di precedenza, prec.
insert el [] prec = [el]
insert el (x:xs) prec = if (prec el x) 
                         then (el:(x:xs))
                         else (x:(insert el xs prec))


insertionsort [] prec = []
insertionsort (x:xs) prec = (insert x (insertionsort xs prec) prec)
Fornire una versione tail-recursive dell'insertion-sort.
(se servissero, si puo' supporre di avere a disposizione le versioni tail-recursive dell'append e del reverse: appendIt e reverseIt).

Esercizio 2
(a) Cosa si intende per complex value in PICT?
Cosa descrive la segente regola?
[[(val p = v e)]] = (def c p = [[e]] [[v → c]])     (Cps-Val)

(b) Cosa si intende per "dynamic dispatch" nel contesto dei linguaggi O.O.? Featherweight Java utilizza il dynamic dispatch? Giustificare.

Esercizio 3
(a) Descrivere l'uso dell'algoritmo di unificazione nella valutazione di programmi PROLOG.

(b) Descrivere (possibilmente anche con un breve esempio) quella che viene comunemente indicata come Declarative Concurrency.