Kolmas Scala praktikum
Lahendage baastest0 ja baastest1.
Ülesanne 1
Saada aru järgnevast programmist.
object Prog1 {
def liidaOption(xs: Seq[Option[Int]]): Int = {
var s = 0
for (x <- xs){
x match {
case Some(y) => s += y
case None =>
}
}
s
}
def liidaKorrutaEither(xs: Seq[Either[Int,Int]]): Int = 0
def main(args: Array[String]) : Unit = {
val x = liidaOption(
Seq(Some(1), None, Some(2), Some(3)))
printf("x on %d\n", x)
val y = liidaKorrutaEither(
Seq(Left(2), Right(3), Left(-1), Left(3)))
printf("y on %d\n", y)
assert(y == ((2*3)+(-1))+3)
}
}
Eelnevas programmis implementeerida liidaKorrutaEither, kus Left väärtused liidetakse ja Right väärtused korrutatakse vahetulemusega.
Ülesanne 2
Saada aru järgnevate klasside definitsioonidest, nii et te suudate sisestada Orwelli raamatu "1984" kirje ja (näiteks) teile kõige rohekem
meeldiva Indrek Hargla romaani. (Kasutades vajadusel wikipediat!)
Kirjutage need Prog2-e. Vajadusel lisada "case class" ValikulineKuupäev-le,mis väljendab ainult aasta teadmist.
abstract class ValikulineKuupäev
case class Kuupäev(päev: Int, kuu: Int, aasta:Int)
extends ValikulineKuupäev
case object Teadmata extends ValikulineKuupäev {}
class Autor(
val nimi: String,
val sünd: ValikulineKuupäev = Teadmata,
val surm: ValikulineKuupäev = Teadmata){
var alias : Seq[String] = Seq()
}
class Raamat(autor: Autor,
pealkiri: String,
avaldatud: ValikulineKuupäev) {
}
object Prog2 {
def main(args: Array[String]): Unit = {
}
}
Ülesanne 3
Muutke eelnevat koodi nii, et oleks võimalik eelnevalt loodud objektides autorite andmeid muuta.
Ülesanne 4
Muutes eelnevat programmi, tehke kaks implementatsiooni, millega saab väljastada 'ValikulineKuupäev' väärtust sõnena. Teadmata peaks vastama sõnele "?" ja teatud kuupäev peaks olema formaadis pp/kk/aaaa.
Nõutud versioonid:
- nii nagu Javas seda tegema peaks ehk OOP lahendus ja
- Haskelli moodi lahendus (pattern matching).
Ülesanne 5
Tutvuda järgneva klassi-hierarhiaga. Implementeerida kahel eri viisil koerte klassifitseerimist suuruse ning karva pikkuse järgi. Suuruse klassifitseerida sõnedega: "suur", "väike", "teadmata" ja karva pikkust: "pikk", "lühike" või "teadmata". NB! Iga koer, ka hiljem lisatu, peab saama klassifitseeritud.
- funktsioonina "... match { case ..." kasutades
- väljade/meetodite lisamisega klassidesse
abstract class Koer(nimi: String)
class TšauTšau(nimi: String) extends Koer(nimi)
class Pommerlane(nimi: String) extends Koer(nimi)
class Taksikoer(nimi: String) extends Koer(nimi)
class LabradorRetriever(nimi: String) extends Koer(nimi)
object Prog3 {
def suurusMatch(k:Koer) : String = ???
def karvMatch(k:Koer) : String = ???
def main(args: Array[String]): Unit = {
//...
}
}