Kolmas Scala praktikum
Lahendage baastest0 ja baastest1.
Ülesanne 1
Saada aru järgnevast programmist.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
object Prog 1 { 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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 Prog 2 { 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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 Prog 3 { def suurusMatch(k : Koer) : String = ??? def karvMatch(k : Koer) : String = ??? def main(args : Array[String]) : Unit = { //... } } |