Programmazione Funzionale e Parallela

Corso di Laurea in Ingegneria Informatica e Automatica - A.A. 2021-2022

Home | Avvisi | Diario lezioni | Esercitazioni | Materiale didattico | Esami | Valutazioni studenti

Esercitazione del 24 novembre 2021

Istruzioni per l’esercitazione:

Per maggiori informazioni fate riferimento al regolamento delle esercitazioni.

Esercizio 1 (Viticoltori)

Scrivere un metodo def annataPiuVecchia(produttori:List[Produttore], vitigni:List[Vitigno], vini:List[Vino], produttore:String):Option[Int] che data una lista di produttori vinicoli, una lista di possibili vitigni e il nome di un produttore, restituisce un Some dell’annata del vino più vecchio prodotto da quel produttore, oppure None se il produttore è sconosciuto o non ha vini. Si veda il file E1Main.scala per la definizione delle varie classi.

Suggerimento: usare i metodi find (può essere utile il metodo get su un Option), filter, minBy. Può anche essere utile la gestione delle eccezioni.

Usare il main di prova incluso nel codice dell’esercitazione scaricato.

Esercizio 2 (Alberi)

Aggiungere alla classe Tree il seguente metodo def mapTree[B](t:Tree[B], f:A=>B):Boolean che, dato l’albero this su cui il metodo è invocato e un altro albero t, restituisce true se gli alberi sono uguali come struttura e ogni nodo di t contiene un elemento ottenuto applicando la funzione f al corrispondente nodo di this. Usare il main di prova incluso nel codice dell’esercitazione scaricato.

Esercizio 3 (Primalità)

Fare in modo che sia disponibile un metodo su interi def isPrime:Boolean che verifica se il numero su cui viene invocato è primo. Usare il main di prova incluso nel codice dell’esercitazione scaricato.

Soluzioni
Esercizio 1 (Viticoltori)
object E1 {
    def annataPiuVecchia(produttori:List[Produttore],
                         vitigni:List[Vitigno],
                         vini:List[Vino],
                         produttore:String):Option[Int] = {
        try {
            val indiceProd = produttori.find(p=>p.nome == produttore).get.idProd
            val viniProd = vini.filter(v=>v.idProd==indiceProd)
            Some(viniProd.minBy(v=>v.annata).annata)
        }
        catch {
            case e:Exception => None
        }
    }
}
Esercizio 2 (Alberi)
sealed abstract class Tree[A] {
    def mapTree[B](t:Tree[B], f:A=>B):Boolean = (this,t) match {
        case (E(),E()) => true
        case (T(l1,e1,r1),T(l2,e2,r2)) if (e2==f(e1)) => l1.mapTree(l2,f) && r1.mapTree(r2,f)
        case _ => false
    }
}

case class T[S](l:Tree[S], e:S, r:Tree[S]) extends Tree[S]
case class E[S]() extends Tree[S]
Esercizio 3 (Primalità)
import scala.language.implicitConversions

object E3 {
    implicit def int2MyInt(n:Int) = E3(n)
}

case class E3(n:Int) {
    def isPrime:Boolean =
        (2 to n/2).forall(i => n % i != 0)
}

Valid XHTML 1.0 Transitional     Valid CSS!