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 = { //... } }