Giovedì 19 ottobre 2017 (130 min)
Esercizio 1: data analytics
Si vuole scrivere un metodo Scala select che, data una lista di automobili e una lista di proprietari, trova per ogni proprietario lanno della sua automobile più vecchia. Assumere che ogni proprietario nella lista di input possegga almeno unauto.
Scrivere la soluzione in modo da poter eseguire il seguente programma di prova:
case class Car
(model:
String, year:Int, owner:
String)
object A1Main
extends App
{
val cars =
List(Car
("Tesla Model X",
2017,
"Elon"),
Car
("Open Zafira",
2008,
"Anna"),
Car
("Audi Quattro",
2013,
"Ron"),
Car
("Rover 220 SDI",
1999,
"Anna"))
val owners =
List("Elon",
"Anna")
val res:
List[Int
] = A1.
select(cars, owners
)
println
(res +
" - corretto: List(2017,1999)")
}
Soluzione:
object A1
{
def select
(cars:
List[Car
], owners:
List[String]):
List[Int
] =
{
owners.
map(
o => cars.
filter(_.
owner==o
)
.
reduce((a,b
) =>
if (a.
year<b.
year) a
else b
)
.
year
)
}
}
Esercizio 2: conversioni implicite
Cosa bisognerebbe scrivere per poter compilare ed eseguire il seguente programma di test?
import MiaStringa._
object Test extends App {
val s = "ciao" concatenaCon "pippo"
println(s)
}
Soluzione:
import scala.language.implicitConversions
object MiaStringa
{
case class MiaStringa
(x:
String) {
def concatenaCon
(y:
String) = x+y
}
implicit def stringToMiaStringa
(s:
String) = MiaStringa
(s
)
}
Esercizio 3: ancora conversioni implicite
Cosa bisognerebbe scrivere per poter compilare ed eseguire il seguente programma di test?
import A2._
object A2Main extends App {
val r1:Int = 12 mcd 8
println(r1+" [corretto=4]")
val r2:Int = 21 mcd 14
println(r2+" [corretto=7]")
val r3 = MioInt(10) + 7
println(r3+" [corretto=17]")
}
Soluzione:
import scala.language.implicitConversions
object A2 {
implicit def intToMioInt(i:Int) = MioInt(i) // questo serve per rendere possibile 12 mcd 8
implicit def mioIntToInt(i:MioInt) = i.x // questo serve per rendere possibile MioInt(10) + 7
case class MioInt(x:Int) {
def mcd(y:Int):Int =
if (y==0) x else y mcd x%y
}
}
Esercizio 4: nuovi costrutti in Scala
object MyWhile
extends App
{
var time =
0.0 // tempo totale speso nel corpo del mywhile
// definizione di un nuovo costrutto in Scala
def mywhile
(test: =>Boolean
)(body: =>Unit
):Unit =
{
if (!test
) ()
else {
val start =
System.
currentTimeMillis()
body
time +=
System.
currentTimeMillis()-start
mywhile
(test
)(body
)
}
}
// esempio di uso del costrutto
var i =
0
mywhile
(i < args.
size) {
println
("arg: "+args
(i
))
i +=
1
}
println
("Tempo speso nel corpo del mywhile: " + MyWhile.
time +
" ms")
}
Esempio di uso:
> scalac MyWhile.scala
> scala MyWhile uno due tre quattro
arg: uno
arg: due
arg: tre
arg: quattro
Tempo speso nel corpo del mywhile: 2.0