uniroma1.E*Main.scala.cognome.nome. Sulle postazioni del laboratorio sarà /home/studente/Desktop/cognome.nome/.cognome.nome.zip (zip -r cognome.nome.zip cognome.nome/).cognome.nome.zip.Per maggiori informazioni fate riferimento al regolamento delle esercitazioni.
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.
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.
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.
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
}
}
}
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]
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)
}