[ Pobierz całość w formacie PDF ]

mo na dodawa i mno y , stwórzmy wi c przeznaczone do tego metody (listing 5.11).
Kup ksi k Poleć ksi k
134 ROZDZIA 5. Domniemane warto ci i widoki podstaw ekspresywnego kodu
Listing 5.11. Klasa ComplexNumber reprezentuj ca liczb zespolon
package complexmath
case class ComplexNumber(real : Double, imaginary : Double) {
def *(other : ComplexNumber) =
ComplexNumber( (real*other.real) - (imaginary * other.imaginary),
(real*other.imaginary) + (imaginary * other.real) )
def +(other : ComplexNumber) =
ComplexNumber( real + other.real, imaginary + other.imaginary )
}
Dodawanie (+) polega na dodaniu do siebie osobno cz ci rzeczywistej i urojonej dwóch
liczb. Mno enie (*) jest nieco bardziej z o one. Definiuje si je w nast puj cy sposób:
Cz rzeczywista iloczynu dwóch liczb zespolonych to iloczyn ich
komponentów rzeczywistych pomniejszony o iloczyn ich cz ci urojonych:
(real*other.real) - (imaginary * other.imaginary).
Cz urojona iloczynu dwóch liczb zespolonych to suma iloczynów cz ci
rzeczywistej jednej liczby z cz ci urojon drugiej: (real*other.imaginary) +
(imaginary * other.real).
Klasa ComplexNumber wspiera teraz dodawanie i mno enie. Zobaczmy j w akcji:
scala> ComplexNumber(1,0) * ComplexNumber(0,1)
res0: imath.ComplexNumber = ComplexNumber(0.0,1.0)
scala> ComplexNumber(1,0) + ComplexNumber(0,1)
res1: imath.ComplexNumber = ComplexNumber(1.0,1.0)
Pierwsza linia mno y liczb rzeczywist z liczb urojon  wynikiem jest liczba urojona.
Druga linia dodaje do siebie liczb rzeczywist i urojon , tworz c liczb zespolon . Ope-
ratory + i * dzia aj zgodnie z oczekiwaniami, jednak wywo ywanie metody wytwór-
czej ComplexNumber jest troch m cz ce. Mo na to upro ci , stosuj c now notacj dla
liczb zespolonych.
W matematyce liczby zespolone najcz ciej przedstawia si jako sum cz ci rzeczy-
wistej i urojonej. Liczba ComplexNumber(1.0,1.0) zosta aby zapisana jako 1.0 + 1.0*i,
gdzie i to jednostka urojona, odpowiadaj ca pierwiastkowi kwadratowemu z  1. Taka
notacja by aby optymaln sk adni dla biblioteki zajmuj cej si liczbami zespolonymi.
Zdefiniujmy symbol i powi my go z pierwiastkiem kwadratowym z  1.
package object complexmath {
val i = ComplexNumber(0.0,1.0)
}
Zdefiniowali my w ten sposób warto val i w obiekcie pakietowym complexmath. Nazwa
i staje si dost pna w ca ym pakiecie, mo liwe jest tak e jej bezpo rednie importowanie.
Za jej pomoc mo na konstruowa liczby zespolone z ich cz ci rzeczywistej i urojonej.
Ci gle jednak brakuje pewnego elementu, co pokazuje nast puj ca sesja REPL:
scala> i * 1.0
:9: error: type mismatch;
found : Double(1.0)
required: ComplexNumber
i * 1.0
Kup ksi k Poleć ksi k
5.4. Ograniczanie zakresu encji domniemanych 135
Próba pomno enia naszej liczby urojonej przez warto typu Double ko czy si niepowo-
dzeniem, poniewa typ ComplexNumber definiuje mno enie jedynie dla zmiennych typu
ComplexNumber. W matematyce mo liwe jest mno enie liczb rzeczywistych przez ze-
spolone, poniewa na liczb rzeczywist mo na spojrze jak na liczb zespolon bez
cz ci urojonej. T w a ciwo liczb rzeczywistych mo na emulowa w Scali za pomoc
domniemanej konwersji z Double na ComplexNumber:
package object complexmath {
implicit def realToComplex(r : Double) = new ComplexNumber(r, 0.0)
val i = ComplexNumber(0.0, 1.0)
}
Obiekt pakietowy complexmath zawiera teraz tak e definicj warto ci i oraz domniemanej
konwersji z Double na ComplexNumber o nazwie realToComplex. Chcieliby my ograniczy
zastosowanie tej konwersji do przypadków, w których jest ona absolutnie konieczna.
Spróbujmy zastosowa pakiet complexmath bez jawnego importowania adnych konwersji:
scala> import complexmath.i
import complexmath.i
scala> val x = i*5.0 + 1.0
x: complexmath.ComplexNumber = ComplexNumber(1.0,5.0)
Warto val x zosta a zadeklarowana za pomoc wyra enia i*5 + 1 i ma typ ComplexNumber.
Cz rzeczywista to 1.0. a cz urojona 5.0. Zwró uwag , e tylko nazwa i zosta a
zaimportowana z complexmath. Pozosta e domniemane konwersje s wywo ywane z obiektu
i, gdy tylko kompilator napotyka wyra enie i*5. O warto ci i wiadomo, e jest liczb
zespolon ComplexNumber i e definiuje metod *, która wymaga drugiej warto ci typu
ComplexNumber. Litera 5.0 nie jest typu ComplexNumber, tylko Double. Kompilator rozpo-
czyna zatem wyszukiwanie domniemanej konwersji Double => complexmath.ComplexNumber,
znajduj c wreszcie konwersj realToComplex w obiekcie pakietowym. Nast pnie kompi- [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • themoon.htw.pl
  •