Slide 1

Слични документи
Slide 1

Tutoring System for Distance Learning of Java Programming Language

Microsoft PowerPoint - OOPpredavanja05 [Compatibility Mode]

UVOD - OD JAVE DO C# ELEMENTARNE RAZLIKE Veliki broj Java/C# razlika su uglavnom preimenovane ključne reči i razlike u konvencijama imenovanja. Neke o

VEŽBA 5: KLASE I OBJEKTI U C# Cilj ove vežbe je upoznavanje sa osnovama rada sa klasama i objektima u programskom jeziku C#. Pored toga, bide demonstr

Tutoring System for Distance Learning of Java Programming Language

PowerPoint Presentation

Класе комбинација презентације (Хортона) и к о бајаги скрипте (Ово је прича коју врло радо причам) нови тип података: дефинишу могуће вредности подата

Microsoft PowerPoint - 13-Funkcije_2.ppt [Compatibility Mode]

Funkcije predavač: Nadežda Jakšić

Tutoring System for Distance Learning of Java Programming Language

Tutoring System for Distance Learning of Java Programming Language

Microsoft PowerPoint - Programski_Jezik_C_Organizacija_Izvornog_Programa_I_Greske [Compatibility Mode]

Microsoft Word - 11 Pokazivaci

Razvoj programa, Code::Blocks, struktura programa, printf, scanf, konverzioni karakteri predavač: Nadežda Jakšić

Računarski praktikum I - Vježbe 03 - Implementacija strukture string

Microsoft PowerPoint - 12-Funkcije_1.ppt [Compatibility Mode]

Funkcije predavač: Nadežda Jakšić

PowerPoint Presentation

Inženjering informacionih sistema

Zadatak 011 Razmotrite sljedeći primjer. package hr.fer.oopj.primjeri.p011; public class Main { } public static void main(string[] args) { obrada(2.71

Uvod u računarstvo 2+2

PowerPoint Presentation

Microsoft Word - Java_introduction_NEW_SYLLABUS.doc

Programiranje 2 0. predavanje Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb Prog2 2019, 0. predavanje p. 1/4

Računarski praktikum I - Vježbe 07 - Podstrukture, const, reference

Projekti šabloni

PROMENLJIVE, TIPOVI PROMENLJIVIH

PowerPoint Presentation

Osnovi programiranja Beleške sa vežbi Smer Računarstvo i informatika Matematički fakultet, Beograd Jelena Tomašević i Sana Stojanović November 7, 2005

P1.2 Projektovanje asemblera

Sveucilište u Zagrebu

Uvod u računarstvo 2+2

Grananje u programu predavač: Nadežda Jakšić

Programski jezici i strukture podataka 2018/2019. Programski jezici i strukture podataka Računarske vežbe vežba 10 Zimski semestar 2018/2019. Studijsk

I grupa 1. Napisati program koji izračunava i ispisuje zbir 4 najveća od pet brojeva unetih sa standardnog ulaza. ulaz izlaz Analiza: 1.

Objektno orjentirano programiranje 2P

P11.3 Analiza zivotnog veka, Graf smetnji

Microsoft PowerPoint - JavaP9_2019

3.Kontrlne (upravlja~ke) strukture u Javi

Programski jezik C

Microsoft PowerPoint - Bitovi [Compatibility Mode]

Microsoft PowerPoint - C-4-1

Programiranje 2 popravni kolokvij, 15. lipnja Ime i prezime: JMBAG: Upute: Na kolokviju je dozvoljeno koristiti samo pribor za pisanje i brisanj

PowerPoint Presentation

Microsoft PowerPoint - Datoteke [Compatibility Mode]

Programiranje 1 Beleške sa vežbi Školska 2007/2008 godina Matematički fakultet, Beograd Jelena Tomašević December 5, 2007

Uvod u računarstvo 2+2

Računarski praktikum I - Vježbe 09 - this, static

070-ALIP2-udzbenik.indb

Teorija skupova - blog.sake.ba

Microsoft Word - CAD sistemi

Programiranje 1 drugi kolokvij, 2. veljače Ime i prezime: JMBAG: Upute: Na kolokviju je dozvoljeno koristiti samo pribor za pisanje i brisanje,

Datum: 20

PowerPoint Presentation

PRIRODNO MATEMATIČKI FAKULTET U NIŠU DEPARTMAN ZA RAČUNARSKE NAUKE Utorak, godine PRIJEMNI ISPIT IZ INFORMATIKE 1. Koja od navedenih ekste

Programiranje u C-u ili C++-u Pseudo-slučajni brojevi; Dinamička alokacija memorije 1 ZADACI SA ČASA Zadatak 1 Napraviti funkciju koja generišlučajan

Računarski praktikum I - Vježbe 11 - Funktori

PowerPoint Presentation

Microsoft PowerPoint - 07-DinamickeStrukturePodataka

Uvod u računarstvo 2+2

1 jmbag ime i prezime Programiranje 2 prvi kolokvij, Rezultati i uvidi u kolokvije: Rezultati u petak, 3.5., navečer na webu, a uvidi u p

Microsoft Word - MySQL_3.doc

Microsoft Word - 02 Elementi programskog jezika Pascal

Konverzije, operatori, matematičke funkcije predavač: Nadežda Jakšić

Uvod u PHP

Microsoft PowerPoint - MR - Vjezbe - 03.ppt [Compatibility Mode]

Microsoft PowerPoint - 10-Jednodimenzionalni nizovi.ppt [Compatibility Mode]

Logicko projektovanje racunarskih sistema I

Funkcijska sučelja: često korištena za modeliranje objekata koji obavljaju određene poslove Anotirana su signaliziraju da se t

Primenjeno programiranje - vezbe GUI i baze podataka

MIP-heuristike (Matheuristike) Hibridi izmedu metaheurističkih i egzaktnih metoda Tatjana Davidović Matematički institut SANU

Рачунарска интелигенција

PowerPoint Presentation

Programiranje 1 IEEE prikaz brojeva sažetak Saša Singer web.math.pmf.unizg.hr/~singer PMF Matematički odsjek, Zagreb Prog1 2018, IEEE p

Skripte2013

Matematiqki fakultet Univerzitet u Beogradu Iracionalne jednaqine i nejednaqine Zlatko Lazovi 29. mart 2017.

6-8. ČAS Celobrojno programiranje Rešavamo sledeći poblem celobrojnog programiranja: Gde pretpostavljamo da je A celobrojna matrica dimenzije,. Takođe

P1.3 Projektovanje makroasemblera

Celobrojno programiranje Rešavamo sledeći poblem celobrojnog programiranja: min c T x Ax = b x 0 x Z n Gde pretpostavljamo da je A celobrojna matrica

Microsoft PowerPoint - 6. Query Builder.pptx

Classroom Expectations

Računarski praktikum I - Vježbe 01 - Uvod

PowerPoint Presentation

NAPOMENA: Studenti na ispit donose kod urađenog zadatka

My_P_Trigo_Zbir_Free

13E114PAR, 13S113PAR DOMAĆI ZADATAK 2018/2019. Cilj domaćeg zadatka je formiranje petlje softverske protočnosti za minimalni broj ciklusa.

Upitni jezik SQL

Univerzitet u Novom Sadu Tehnički fakultet Mihajlo Pupin Zrenjanin Seminarski rad Predmet: Konkuretno programiranje doc. dr Dejan Lacmanovic Zorica Br

Strukture predavač: Nadežda Jakšić

Primenjeno programiranje - Vežbe

1

Programiranje II Beleške sa vežbi Smer Informatika Matematički fakultet, Beograd Sana Stojanović 1

KDP

OOP1 - domaci 2 (2004/05)

PowerPoint Presentation

NAUČNO-STRUČNA KONFERENCIJA LOGOPEDA SRBIJE INOVATIVNI PRISTUPI U LOGOPEDIJI Nacionalni skup sa međunarodnim učešćem Organizator: Udruženje logopeda S

Microsoft PowerPoint - 11_JavaScript_1.ppt [Compatibility Mode]

03 SUBP

Транскрипт:

Funkcionalno programiranje Klase -- Funkcionalno programiranje -- ETF Beograd, 2019.

Motivacija Scala je OO jezik potreba za klasama je evidentna Uloga klasa se nije promenila enkapsulacija podataka grupisanje srodnih funkcionalnosti polimorfizam... Scala se snažno oslanja na Javu (mada su moguće i drugačije implementacije) sve klase se implicitno izvode iz java.lang.object preciznije: iz scala.anyref, koji je alias za java.lang.object Scala može da koristi sve Java klase -- Funkcionalno programiranje -- ETF Beograd 2

Klase Osnovni elementi class X { var vrednost = 0 val x1 = new X val x2 = new X // podrazumeva se public x1 vrednost 0 x2 vrednost Podsetnik: val ne znači da je objekat nepromenljiv, već da dato ime ne može da se odnosi na drugi objekat x1.vrednost = 3 x1 = new X // u redu // greška 3

Klase Primer klase Racionalnih brojeva class Rational(x: Int, y: Int) { def numer = x def denom = y Uveden je novi tip Klasa direktno prima parametre, umesto da se piše poseban konstruktor. Parametri nisu vidljivi van tela klase. Implicitno definisan primarni konstruktor Objekti se stvaraju kao u Javi: new Rational(1,2) Članovima se pristupa, kao u Javi, infiksim operatorom. val x = new Rational(1,2) // val x: Rational = new... x.numer // 1 x.denom // 2 x.numer = 2 // greška 4

Klase class Rational(x: Int, y: Int) { println("racionalni broj: " + x + "/" + y) Sav kod koji nije deo definicije polja ili metode biće ugrađen u primarni konstruktor Ugrađivanje se vrši u redosledu pojavljivanja u kodu Kada je potrebna provera validnosti parametara koristi se metoda require (definisana u objektu Predef) class Rational(x: Int, y: Int) { require(y!= 0) Baca izuzetak IllegalArgumentException ako uslov nije ispunjen; u suprotnom nema efekta 5

Metode Namena je ista kao u "klasičnim" OO jezicima (C++, Java) definišu ponašanje objekata dozvoljeno preklapanje operatora kao i definisanje novih operatora class Rational(x: Int, y: Int) { private def gcd(a: Int, b: Int): Int = if(b==0) a else gcd(b, a%b) //razmotriti neg. vred. private val g = gcd(x, y) def numer = x / g def denom = y / g // x.abs, y.abs // ili: val numer: Int = x / g // ili: val denom: Int = y / g override def tostring() = numer + "/" + denom def ili val isto se koriste, ali šta je bolje? def se izračunava pri svakom pozivu val samo jednom 6

Metode Metode često imaju samo bočni efekat, a to je promena stanja objekta Takve metode su po tipu Unit (što odgovara Javinom void) Povratni tip nije neophodno pisati, ali tada telo metode mora biti u vitičastim zagradama, a ne prethodi znak = class X { private var vrednost = 0 // private[this] samo this obj. def promeni(v: Int) { vrednost = v // isto kao: def promeni(v: Int): Unit = vrednost = v -- Funkcionalno programiranje -- ETF Beograd 7

Konstruktori Primarni konstruktor se implicitno generiše jedino on može da pozove konstruktor roditeljske klase može biti proglašen privatnim: class Klasa private {... Moguće je napisati pomoćne (auxiliary) konstruktore Zovu se this class Rational(x: Int, y: Int) {... def this(x: Int) = this(x, 1) // poziv primarnom k. Svaki pomoćni konstruktor mora da pozove neki drugi konstruktor kao svoju prvu aktivnost može da pozove primarni može da pozove pomoćni koji je ranije definisan Alternativno: y: Int = 1 dakle, primarni će uvek biti pozvan, nema mogućnosti ciklusa 8

Konstruktori Telo klase se uslovno može posmatrati kao telo primarnog konsturktora svaki poziv metode će biti izvršen prilikom stvaranja objekta class Student(ime: String, brind: String) { println("stvaram studenta")... var s = new Student("Pera", "123/456")//> Stvaram studenta -- Funkcionalno programiranje -- ETF Beograd 9

Konstruktori Parametri konstruktora mogu imati modifikatore [private] var ili val parametar postaje atribut klase automatski se generišu metode za pristup atributu var: generišu se inspektor i mutator val: generiše se inspektor s.ime = "Mika" s.brind = "122/345" // greška // greška class Student2(var ime: String, val brind: String) { println("stvaram studenta2") val s2 = new Student2("Pera", "123/456")//> Stvaram studenta2 s2.ime = "Mika" s2.brind = "122/345" // greška println(s2.brind) 10

Operatori Svaka metoda sa jednim parametrom može biti korišćena kao infiksni operator class Rational(x: Int, y: Int) { Parametri klase su dostupni samo preko this... def add(r: Rational) = x + r.x... // greška new Rational(numer*r.denom + r.numer*denom, denom*r.denom ) Dakle, može se napisati: r add s umesto: r.add(s) 1+2 je zapravo poziv metode "+" nad Int objektom (1), gde je (2) parametar: 1.+(2) U tom smislu, ne postoji "klasično" preklapanje operatora 11

Operatori Mogu se definisati novi operatori Identifikatori mogu biti: slovo, praćeno sekvencom slova ili cifara simbol operatora, praćen drugim simbolima operatora mešovit identifikator: alfanum_operator - primer: unary_+ Prioritet operatora je određen prvim znakom Asocijativnost je određena poslednjim znakom 12

rastući prioritet Operatori op. dodele (i svi drugi koji se završavaju op. =, osim <= >= ==!=) bilo koje slovo (ne preporučuje se upotreba slova $) ^ & < > =! // samo = nije validan identifikator, ne može se preklopiti : // asocijativnost s desna ulevo ako se ime operatora završava sa : + - * / % svi drugi specijalni znaci (ne preporučuje se _ jer ima specijalnu ulogu) 13

Operatori Primeri operatorskih identifikatora + ++ ::: <?> :-> Scala kompajler interno prevodi identifikatore operatora u validne Java identifikatore. :-> bi postao $colon$minus$greater Obratiti pažnju Scala operatori mogu imati proizvoljnu dužinu U Javi, izraz x<-y bi se interpretirao kao x < (- y) Scala interpretacija je: x <- y Ako se želi Java interpretacija, potreban je razmak < - Operandi se uvek računaju s leva udesno, nebitna asocijativnost Primeri: x *= y+1 tumači se kao x.*=(y+1) a:::b tumači se kao b.:::(a), prvo se računa a, onda b 14

Operatori class Rational(x: Int, y: Int) {... def + (r: Rational) = new Rational(numer * r.denom + r.numer * denom, denom * r.denom ) def - (r: Rational) = new Rational(numer * r.denom - r.numer * denom, denom * r.denom ) def * (r: Rational) = new Rational(numer * r.numer, denom * r.denom ) val x = new Rational(1,2) val y = new Rational(1,3) x*x + y*y // 13/36 15

Operatori - detaljnije u poglavlju 21 - Nije moguće napisati val r = new Rational(2,3) val r1 = r*2 Oba operanda moraju biti tipa Rational Rešenje: preklapanje operatora def * (i: Int): Rational = new Rational(numer + i * denom, denom) Sada je moguće napisati val r1 = r*2 Ali još uvek nije moguće napisati val r1 = 2*r Potrebna konverzija levog operanda implicitna konverzija koja izraz 2 * r prevodi u new Rational(2) * r moguće neimplicitne konverzije se ne razmatraju implicit def inttorational(x: Int) = new Rational(x) 16

Operatori Tehnički, Scala nema preklapanje operatora 1+2 je zapravo poziv metode + nad objektom 1: (1).+(2) Elementima nizova se pristupa oblim zagradama obj(i) je zapravo poziv obj.apply(i) dakle pristup elementu i je zapravo poziv metode sa arg. i Ovo nije ograničeno samo na nizove važi za svaki objekat (ako tip ima definisanu metodu apply) Slično: obj(i) = neka_vrednost poziva se obj.update(i, neka_vrednost) -- Funkcionalno programiranje -- ETF Beograd 17

Unikatni (singleton) objekti Scala je u nekim svojim aspektima više objektno-orijentisana od Jave Ne postoje statički članovi u jeziku Scala Umesto njih, Scala propisuje unikatne objekte Definicija unikatnog objekta: umesto class dolazi object Ne može da se instancira ne koristi se new Unikatni objekat može biti nazvan isto kao i neka klasa tada je on prateći objekat (companion object) toj klasi, a ona je prateća klasa (companion class) tom objektu moraju oba (klasa i objekat) biti definisani u istom fajlu uzajamni odnos prijateljstva pristup čak i privatnim članovima U suprotnom to je samostalni (standalone) objekat 18

Unikatni (singleton) objekti U unikatnim objektima se mogu pisati metode i atributi poput statičkih metoda i atributa u Javi sintaksa pristupa je ista (naziv_objekta. naziv_metode ili atributa) Ali unikatni objekat je objekat (postoji u memoriji) može biti izveden iz druge klase i mogu mu se pridružiti osobine - crte (traits) može mu se obraćati kao i drugim objektima može se prosleđivati tamo gde se očekuju objekti Međutim ne definiše tip podatka to radi prateća klasa (ako postoji) ne instancira se (ne dobija parametre prilikom stvaranja) inicijalizuje se pri prvoj upotrebi -- Funkcionalno programiranje -- ETF Beograd 19

Pravljenje Scala aplikacije Scala program mora da poseduje najmanje jedan samostalni unikatni objekat sa main metodom Alternativno: extends App main metoda ima jedan parametar, tipa Array[String] Program se pokreće imenovanjem samostalnog objekta Scala implicitno uvozi: paket java.lang paket scala unikatni objekat scala.predef println je zapravo Predef.println -- Funkcionalno programiranje -- ETF Beograd 20

Pravljenje Scala aplikacije // strquote.scala package w02 object strquote { def quote(s: String) = ">>"+s // testapp.scala package w02 import strquote.quote object testapp { def main(args: Array[String]) { for( arg <- args ) println(quote(arg)) C:\> scalac strquote.scala testapp.scala C:\> scala testapp xyz >>xyz scala w02.testapp xyz 21

Apstraktne klase i nasleđivanje Apstraktne klase: ne mogu da se instanciraju abstract class IntSet { def incl(x: Int): IntSet def contains(x: Int): Boolean Nasleđivanje class Empty extends IntSet { def contains(x : Int): Boolean = false def incl(x : Int): IntSet = Ovde se daje primer implementacije skupa preko binarnog stabla new NonEmpty(x, new Empty, new Empty) Primetiti: za apstraktne metode ne mora da se piše override u izvedenim klasama 22

Apstraktne klase i nasleđivanje class NonEmpty(elem: Int, left: IntSet, right: IntSet) extends IntSet { def contains(x : Int): Boolean = { if (x < elem) left contains x else if (x > elem) right contains x else true def incl(x : Int): IntSet = { if (x<elem) new NonEmpty(elem, left incl x, right) else if (x>elem) new NonEmpty(elem, left, right incl x) else this -- Funkcionalno programiranje -- ETF Beograd 23

Apstraktne klase i nasleđivanje val x = new NonEmpty(10, new Empty, new Empty) val y = x incl 5 incl 15 incl 7 incl 3 val z = y incl 1 10 z E 10 x E E 1 3 E 5 10 y Primetiti: ovakva konstrukcija ima smisla zato što se pretpostavljaju nepromenljivi objekti 5 15 3 7 E E E E E E 24

Apstraktne klase i nasleđivanje abstract class Entity { def name: String override def tostring = name metoda bez parametara (parameterless) razlikuje se od metoda sa praznim zagradama (empty-paren) class Constant extends Entity { override val name = "Constant" nadjačava metodu iz osnovne klase class Robot(id: Int) extends Entity { def name = "T-" + id class Person(override val name: String) extends Entity parametarsko polje: kad ima modifikator var ili val, postaje atribut klase val e = new Constant println(e.name) // Constant val e2 = new Person("Pera") println(e2.name) // Pera val e3 = new Robot(800) println(e3.name) // T-800 25

Apstraktne klase i nasleđivanje Preporučuje se upotreba metoda bez parametara kada nema parametara i kada je metoda inspektor (samo čita stanje) Posledica klijentski kod ne zna kako je realizovan atribut (vrednost ili metoda) moguće je jednostavno zameniti implementaciju po potrebi to je princip uniformnog pristupa (uniform access principle) vrednost zauzima više memorije, ali se brže (?) izvršava Scala pravi razliku između metoda bez parametara i metoda sa praznim zagradama ali dozvoljava njihovo mešanje (jedna može da nadjača drugu, itd) nije neophodno pisanje zagrada pri pozivu ipak se preporučuje pisanje () kada poziv nije dohvatanje vrednosti 26

Apstraktne klase i nasleđivanje Parametarska polja class Person(val name: String) extends Entity istovremeno postaje parametar i (nepromenljiv) atribut klase ekvivalentno: class Person(n: String) extends Entity { val name = n umesto val može i var Mogući modifikatori su private ili private[this] protected override class Cat { val dangerous = false class Tiger( override val dangerous: Boolean, private var age: Int ) extends Cat 27

Apstraktne klase i nasleđivanje Pozivanje konstruktora roditeljske klase class Cat(val name: String) { val dangerous = false class Tiger( name: String, override val dangerous: Boolean, private var age: Int ) extends Cat(name) Može se pozvati bilo koji konstruktor roditeljske klase -- Funkcionalno programiranje -- ETF Beograd 28

Apstraktne klase i nasleđivanje Sprečavanje izvođenja odnosno nadjačavanja modifikator final, kao u Javi ispred class za sprečavanje izvođenja ispred člana čije nadjačavanje treba sprečiti (atribut ili metoda) final class Cat(val name: String) { val dangerous = false ili class Cat(val name: String) { final val dangerous = false Modifikator sealed dati tip mogu naslediti samo drugi tipovi definisani u istom fajlu sealed abstract class Expr class Var(name: String) extends Expr 29

Primer: singleton Napraviti klasu prema projektnom uzorku unikat (singleton) Analiza: obezbediti da klasa ne bude apstraktna ne može direktno da se instancira objekat date klase metoda koja vrši dohvatanje jedinstvene instance Rešenje: učiniti primarni konstruktor privatnim napraviti prateći objekat sa metodom getinstance -- Funkcionalno programiranje -- ETF Beograd 30

Primer: singleton class NarodnaBiblioteka private { override def tostring : String = "Narodna biblioteka" object NarodnaBiblioteka { val instance = new NarodnaBiblioteka def getinstance = instance val tt = NarodnaBiblioteka.getInstance 31

Hijerarhija klasa 32

Hijerarhija klasa U korenu hijerarhije je klasa Any final def ==(that: Any): Boolean final def!=(that: Any): Boolean def equals(that: Any): Boolean def ##: Int def hashcode: Int def tostring: String -- Funkcionalno programiranje -- ETF Beograd 33

Hijerarhija klasa Klasa AnyVal Roditeljska klasa za svaku ugrađenu vrednosnu klasu a) Byte, Short, Char, Int, Long, Float, Double, Boolean (1:1 Java) radi se automatski box-ing u odgovarajući tip pr. java.lang.integer b) Unit (~ void u Javi) rezultat dodele vrednosti, kao i nekih kontrolnih struktura (while,...) Ne mogu se praviti instance (a) pomoću new tip zato što su sve klase deklarisane kao abstract final Postoji jedna instanca (b), označava se () scala> def greet() { println("hi") a = if (true) 1 else false greet: ()Unit scala> greet() == () hi res0: Boolean = true Kog tipa je a? 34

Hijerarhija klasa Klasa AnyRef Roditeljska klasa za sve referentne tipove Java java.lang.object.net system.object -- Funkcionalno programiranje -- ETF Beograd 35

Hijerarhija klasa Klasa Null tip null reference potklasa svih referentnih tipova (svih koje nasleđuju AnyRef) nije kompatibilna sa vrednosnim tipovima (AnyVal) Klasa Nothing na dnu hijerarhije Scala klasa ne postoje objekti ovog tipa specifični slučajevi upotrebe (izuzetak, tip elementa prazne kolek.) scala.predef def error(message: String): Nothing = throw new RuntimeException(message) def divide(x: Int, y: Int): Int = if (y!= 0) x / y else error("deljenje nulom") 36

Uvoz tipova Automatski: sve iz paketa scala sve iz paketa java.lang svi članovi objekta scala.predef Sintaksa: import paket.tip import paket.{tip1, tip2,... import paket._ -- Funkcionalno programiranje -- ETF Beograd 37

Jednakost objekata - detaljnije u poglavlju 30 - Razlikuje se u odnosu na pristup jezika Java Smisao operatora == je "prirodna" jednakost za vrednosne tipove, to je jednakost vrednosti za referentne tipove, to je jednakost sadržaja (equals u Javi) Za referentne tipove postoji metoda eq, koja odgovara == u Javi ne koristi se mnogo, jer služi samo kada je od interesa identitet objekta Veza između operatora == i equals u jeziku Scala nije moguće nadjačati == (finalna metoda u klasi Any) op == poziva metodu equals metoda equals može se nadjačati za ref. tip. podrazumevano equals: poredi reference (kao u Javi) dakle, podrazumevano == i equals ponašaju se kao eq final def == (that: Any): Boolean = if (null eq this) {null eq that else {this equals that Ali podrazumevano poredi reference. // principijelno 38

Jednakost objekata primer razlike Java Scala Java boolean isequal(integer x, Integer y) { return x == y; System.out.println(isEqual(421, 421)); // false Scala uzima u obzir tip stvarnih argumenata scala> def isequal(x: Int, y: Int) = x == y isequal: (Int,Int)Boolean scala> isequal(421, 421) res10: Boolean = true scala> def isequal(x: Any, y: Any) = x == y isequal: (Any,Any)Boolean scala> isequal(421, 421) res11: Boolean = true 39

Jednakost objekata - detaljnije u poglavlju 30 - U klasi Any definisana je metoda hashcode Ugovor ove metode zahteva da ako equals nad dva objekta vraća true onda i hashcode mora vratiti isti celobrojni rezultat Dakle, equals i hashcode se zajedno nadjačavaju Ova stavka ugovora je bitna zbog kolekcija čiji rad se zasniva na toj pretpostavci Voditi računa da se equals i hashcode ne određuju na osnovu promenljivih (atributa) ako je potrebno poređenje objekata klasa koje imaju promenljive atribute, bolje koristiti neko drugo ime -- Funkcionalno programiranje -- ETF Beograd 40

Parametrizacija tipom Namena: poput generika u Javi (šablona C++) reupotreba koda kada je algoritam isti drugi vid polimorfizma trait Crta[T] class Klasa1[T] class Klasa2[T](par1 : T, par2 : Klasa1[T]) extends Crta[T] Mogu se i metode parametrizovati: def napravi[t](elem: T) = new Klasa3[T](elem) napravi[int](1) // napravi(1) napravi[boolean](true) // napravi(true) 41

Parametrizacija tipom Vrši se brisanje (type erasure), kao u Javi val seq : Seq[String] = Seq(1,2,3) // ne prevodi se val seq : Seq[Int] = Seq(1,2,3) seq.isinstanceof[seq[int]] // true seq.isinstanceof[int] // false seq.isinstanceof[seq[string]] // true 42

Parametrizacija tipom Moguće je navesti gornje i donje granice za parametarske tipove gornja granica <: donja granica >: Primer: def assertallpositive[s <: IntSet] (r: S) : S =... S može biti svaki tip koji odgovara tipu IntSet [S >: NonEmpty] S može biti NonEmpty, IntSet, AnyRef i Any [S >: NonEmpty <: IntSet] bilo koji tip u intervalu NonEmpty i IntSet 43

Utvrđivanje tipa i konverzija class Any def isinstaceof[t]: Boolean def asinstanceof[t]: T // ClassCastException if (x.isinstanceof[string]) { val s = x.asinstanceof[string] s.length else... Ipak, eksplicitno utvrđivanje tipa treba izbegavati -- Funkcionalno programiranje -- ETF Beograd 44

Konverzija tipa u cilju čitanja vrednosti Ponekad je dovoljno dohvatiti vrednost nekog podatka bez obzira na njegov tip Konverzija u cilju čitanja (view bound): specificira da neki tip može biti "posmatran" kao neki drugi Koristi se oznaka <% Potrebna implicitna (automatska) konverzija između tipova Implicitne funkcije to omogućavaju one dozvoljavaju svoju primenu (apply) kada to može dovesti do zadovoljenja tipova u izrazu -- Funkcionalno programiranje -- ETF Beograd 45

Konverzija tipa u cilju čitanja vrednosti scala> implicit def strtoint(x: String) = x.toint strtoint: (x: String)Int scala> "123" res0: java.lang.string = 123 scala> val y: Int = "123" y: Int = 123 scala> math.max("123", 111) res1: Int = 123 -- Funkcionalno programiranje -- ETF Beograd 46

Konverzija tipa u cilju čitanja vrednosti scala> class Container[A <% Int] { def addit(x: A) = 123 + x defined class Container Ovo znači da A mora biti moguće "posmatrati" kao Int scala> (new Container[String]).addIt("123") res11: Int = 246 scala> (new Container[Int]).addIt(123) res12: Int = 246 scala> (new Container[Float]).addIt(123.2F) <console>:8: error: could not find implicit value for evidence parameter of type (Float) => Int (new Container[Float]).addIt(123.2) 47

Crte (traits) Nasleđuje se samo jedna klasa kao u Javi izbegavanje "dijamantske strukture" trait liči na interfejs u Javi... klasa može da nasledi više crta... ali trait može da sadrži polja može da sadrži implementacije metoda trait Planar { def height : Int def width : Int def surface = height*width -- Funkcionalno programiranje -- ETF Beograd class Square extends Shape with Planar with Movable... 48

Funkcijske vrednosti su objekti Tip funkcije A => B je zapravo skraćeni način pisanja scala.function1[a, B] trait Function1[T1, R] { def apply(v1 : T1) : R def compose[a](g: A => T1): A => R def andthen[a](g: R => A): T1 => A Dakle: funkcije su objekti sa apply metodom Postoje crte Function2, Function3,... Poziv funkcije je jednostavno poziv metode apply f(a, b) je zapravo f.apply(a,b) -- Funkcionalno programiranje -- ETF Beograd 49

Funkcijske vrednosti su objekti (x: Int) => x * x { class some_generic_name extends Function1[Int, Int] { def apply(x: Int) = x * x new some_generic_name Sintaksa anonimne klase: new Function1[Int, Int] { def apply(x:int) = x * x -- Funkcionalno programiranje -- ETF Beograd 50

Definicija funkcije nije funkcijska vrednost Definicija metode: def f(x: Int) : Boolean =... nije funkcijska vrednost Ali, ako se f koristi tamo gde se očekuje tip Function, automatski se konvertuje u funkcijsku vrednost (x: Int) => f(x) Odnosno new Function1[Int, Boolean] { def apply(x: Int) = f(x) -- Funkcionalno programiranje -- ETF Beograd 51

Primer: ulančane liste S obzirom na favorizovanje rekurzije u funkcionalnim jezicima, lista se može predstaviti iz dva gradivna bloka: Nil prazna lista Kons ćelija koja sadrži element i referencu ka ostatku liste Termin "cons" vodi poreklo iz jezika Lisp Funkcionalni jezici favorizuju nepromenljive liste val testlist = new Elem(1, new Elem(2, new Elem(3, new Nil))) -- Funkcionalno programiranje -- ETF Beograd 52

Primer: ulančane liste object list { trait List[T] { def prazna: Boolean def glava: T def rep: List[T] class Nil[T] extends List[T] { def prazna = true def glava = throw new NoSuchElementException("Nil.glava") def rep = throw new NoSuchElementException("Nil.rep") class Elem[T](val glava : T, val rep : List[T]) extends List[T] { def prazna = false 53