Linguaggi di Programmazione (19 Giugno 2014)
Esercizio 1
Si consideri il seguente codice Haskell incompleto
data ......
treeapply f (Leaf x) = x
treeapply f (Node n t1 t2) = f n (treeapply f t1) (treeapply f t2)
e si completi con la definizione del tipo di dato in modo che questa
risulti la piu' generale possibile.
Cosa calcola la funzione treeapply?
Cosa restituisce l'interprete se chiediamo la cosa seguente?
:type treeapply
Giustificare la risposta.
Esercizio 2
Scrivere il corrispettivo Erlang della funzione treeapply
dell'Esercizio 1,
in modo che la computazione sia parallelizzabile il piu' possibile.
Supporre di aver definito in Erlang un modulo
-module(bt)
-export(leaf/1, nodeLabel/3, getRoot/1, subtreeL/1, subtreeR/1, isLeaf/1)
Esercizio 3
Descrivere brevemente le caratteristiche principali della programmazione funzionale.
Quali di queste caratteristiche sono state utilizzate nello sviluppo di Erlang per
fare i modo che tale linguaggio permetta di programmare in modo concerrente seguendo
il modello ad attori?
Esercizio 4
Descrivere l'algoritmo di unificazione per i simple types.
Semplici varianti di tale algoritmo sono utilizzate sia in Haskell
che in Prolog. Discutere brevemente lo scopo per cui sono utilizzate.
Che differeenza c'e' tra unificazione e pattern-matching?
Esercizio 5
Supponendo di voler implementare in Prolog il type checker di FJ,
scrivere la clusole Prolog relative alla parte di programma corrispondente
alla seguente regola FJ:
Per semplicita' si supponga di avere gia' delle clausole per mtype e per
controllare se una classe e' definita nella Class Table attraverso l'uso di extends
Si assuma inoltre che tutti i metodi siano unari.
Esercizio 6
Fornire le regole che definiscono la relazione di sottotipo in PICT per
tipi input e tipi output. Darne una giustificazione informale.