2. előadás
Ismétlés
λ maxBound :: Int
9223372036854775807
λ (maxBound :: Int) + 1 --> Túlcsordulás
-9223372036854775808
λ minBound :: Int
-9223372036854775808
λ (minBound :: Int) - 1
9223372036854775807
- Int - megadott pontosságú egész szám
- Integer - tetszőleges pontosságú egész szám
- Float/Double - racionális számok
Típusosztályok
Valamilyen tulajdonság szerinti csoportosítása a típusoknak
Num: bármilyen számFractional: (Num) Tört számok (Float, Double)Integral(Num) Egész számFloating(Fractional, így Num is) Lebegőpontos törtszám
Ad-hoc polimorfizmus Több típus is tartozhat egy függvényhez, elég annak a családját megadni (hasonlóan a metódus túlterheléshez imperatív nyelveken)
Típusmegszorítások
aitt bármilyen számtípus lehet, ami aFractional-ből származik leNote: Ha csak a van megszorírva, akkor mondjuk b lehet bármilyen típus
λ :i Fractional
type Fractional :: * -> Constraint
class Num a => Fractional a where
(/) :: a -> a -> a
recip :: a -> a
fromRational :: Rational -> a
{-# MINIMAL fromRational, (recip | (/)) #-}
-- Defined in ‘GHC.Real’
instance Fractional Float -- Defined in ‘GHC.Float’
instance Fractional Double -- Defined in ‘GHC.Float’
A Fractional típusosztály a Num-ból származik.
A
3, mint konstans, a Num típusosztályt használjaEbből következően a fordító tetszőlegesen bármalyik szám függvényben fogja tudni használni (típuskényszerítve már nem)
A (+) függvény például össze tud adni bármilyen két tetszőleges azonos típusú számot.
A Num típusosztály szűkíthető például az Int, Integer típusokkal, de ez fordítva már nem igaz.
Osztás
Egészeket osztani lehet?
Így nem, csak Fractional-re van implementálva.
Egész számokra az Integral osztálytípus érvényes.
λ :i Integral
type Integral :: * -> Constraint
class (Real a, Enum a) => Integral a where
quot :: a -> a -> a
rem :: a -> a -> a
div :: a -> a -> a
mod :: a -> a -> a
quotRem :: a -> a -> (a, a)
divMod :: a -> a -> (a, a)
toInteger :: a -> Integer
{-# MINIMAL quotRem, toInteger #-}
-- Defined in ‘GHC.Real’
instance Integral Word -- Defined in ‘GHC.Real’
instance Integral Integer -- Defined in ‘GHC.Real’
instance Integral Int -- Defined in ‘GHC.Real’
Itt láthatóak az implementált függvények.
div: egész számok osztása
divMod : egész számok osztása, és moduló művelete egy rendezett párként visszaadva
-- g' :: Int -> Int -> Int
-- g'' :: Integer -> Integer -> Integer
-- ^--> ez a kettő együtt --v
g :: Integral a => a -> a -> a
Note:
=- Hozzárendelés
==- Egyenlőségvizsgálat
/=- Egyenlőtlenségvizsgálat
Prelude> :i Floating
type Floating :: * -> Constraint
class Fractional a => Floating a where
pi :: a
exp :: a -> a
log :: a -> a
sqrt :: a -> a
(**) :: a -> a -> a
logBase :: a -> a -> a
sin :: a -> a
cos :: a -> a
tan :: a -> a
asin :: a -> a
acos :: a -> a
atan :: a -> a
sinh :: a -> a
cosh :: a -> a
tanh :: a -> a
asinh :: a -> a
acosh :: a -> a
atanh :: a -> a
GHC.Float.log1p :: a -> a
GHC.Float.expm1 :: a -> a
GHC.Float.log1pexp :: a -> a
GHC.Float.log1mexp :: a -> a
{-# MINIMAL pi, exp, log, sin, cos, asin, acos, atan, sinh, cosh,
asinh, acosh, atanh #-}
-- Defined in `GHC.Float'
instance Floating Float -- Defined in `GHC.Float'
instance Floating Double -- Defined in `GHC.Float'
Függvénykompozíció
-- f (g x) -> (f ∘ g) x
-- h (f (g x)) -> (h ∘ f ∘ g) x
iSqrt :: Integral a => a -> a
iSqrt i = (round . sqrt . fromIntegral) i
fromIntegral: (Integral a, Num b) => a -> bround: (RealFrac a, Integral b) => a -> b