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)
}