Programmazione Funzionale e Parallela

Corso di Laurea in Ingegneria Informatica e Automatica - A.A. 2017-2018

HomePage | Avvisi | Diario lezioni | Materiale didattico | Esami | Forum | Login

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 l’anno della sua automobile più vecchia. Assumere che ogni proprietario nella lista di input possegga almeno un’auto.

Scrivere la soluzione in modo da poter eseguire il seguente programma di prova:

A1Main.scala
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:

A1.scala
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?

Test.scala
import MiaStringa._

object Test extends App {
    val s = "ciao" concatenaCon "pippo"
    println(s)
}


Soluzione:

MiaStringa.scala
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:

A1.scala
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

MyWhile.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
Valid XHTML 1.0 Transitional :: Valid CSS :: Powered by WikkaWiki
Page was generated in 0.2641 seconds