Konverziók és kerekítések

Konverzió helyett típusmegkötés

Sokszor nincs szükség konverzióra, elég a típusmegkötés:

Test>
1 :% 10 :: Rational
Test>
0.10000000000000009 :: Double
Test>
0.100000024 :: Float
Test>
121 :% 100 :: Rational
Test>
1.2100000000000002 :: Double

Nem történik konverzió, már a literálok is adott típusúként születnek meg.


Az információáramlás visszafelé történik a (-) és (*) operátorok polimorf volta miatt.

Feladatok

Van-e különbség köztük?

Test>
Test>
Test>

Mi lesz a következő kifejezéssel?

Test>

Alapértelmezett típusok

Ha nem derül ki a környezetből a konkrét típus és számolásra kerül a sor:

Test>
6 :: Integer
Test>
0.6666666666666666 :: Double

A kódban a default kulcsszóval szabályozhatjuk ezt a viselkedést:

default (Integer, Double)

Feladatok

Mi a kitevő típusa a következőben?

Test>

Érjük el hogy a 4 típusa más legyen! (Nem fog látszani a változás.)

Egész számok konvertálása

fromIntegral :: (Integral a, Num b) => a -> b

A fromIntegral legalább a következő konverziókra alkalmas:


A Haskellben a számok közt szándékosan nincs implicit konverzió.

Törtek konvertálása

realToFrac :: (Real a, Fractional b) => a -> b

A realToFrac legalább a következő konverziókra alkalmas:

Feladatok

El lehet-e végezni valamelyik függvénnyel a következő konverziót?

Int            -> Integer
Int            -> Double
Float          -> Rational
Rational       -> Integer

Kerekítések

truncate :: (RealFrac a, Integral b) => a -> b -- nulla fele kerekítés
round :: (RealFrac a, Integral b) => a -> b -- legközelebbihez kerekítés
ceiling :: (RealFrac a, Integral b) => a -> b -- felfele kerekítés
floor :: (RealFrac a, Integral b) => a -> b -- lefele kerekítés

Feladatok

Igazak-e?

ceiling x  ==  1 + floor x

truncate x  ==  (floor x + ceiling x) `div` 2
sqrt :: Floating a => a -> a -- gyökvonás

Számoljuk ki a 10^9 gyökéhez legközelebb eső egész számot!

Solution>

Az Enum osztály

toEnum :: Enum a => Int -> a
fromEnum :: Enum a => a -> Int

Példányok: Enum Char, Enum Integer, Enum Int, Enum Rational, Enum Float, Enum Double, …

Test>
'd' :: Char

Feladatok

Mi az unikód kódja az ‘x’ karakternek?

Solution>

Melyik az 50 unikód kódú karakter?

Solution>