Kihagyás

3. gyakorlat

fromIntegral :: (Integral a, Num b) => a -> b
--                                     ^----^---- típusváltozók
realToFrac :: (Real a, Fractional b) => a -> b
--            ^^^^^^^^^^^^^^^^^^^^^^---- megkötés

A példa szerint a a valós, b pedig a tört típuscsaládra van megkötve (Leszármazás engedett).

Típusosztály: pl. Integral, Real, Num

Függvények

  • fromIntegral : "Egész" számról tud átalakítani tetszőleges számra
  • realToFrac : "Valós" számokról tört számokra tud képezni
  • truncate, ceiling, floor, round: Tört számot kerekítenek egész számra
g :: a -> a -- 1 féleképpen megaírható
g x = x -- Identitás függvény

Listák (egyirányú láncolt lista)

  • []: üres lista (a lista vége)
  • (:) :: a -> [a] -> [a]: lista elejére helyez egy elemet
    • 1 : 2 : [] -> [1,2]
  • (++) :: [a] -> [a] -> [a] első lista másodikhoz hozzátoldása

Elemeinek azonos típusúnak kell lennie

Homogén adatszerkezet: Az adatszerkezetben csak azonos típusú elemek szerepelhetnek pl. Lista Heterogén adatszerkezet: !Homogén adatszerkezet pl. Tuple

1:2:3:[]
-- megegyezik:
[1, 2, 3]

Lista függvények

Lista ürességének vizsgálata (beépítve null néven)

null'  :: [a] -> Bool
null' [] = True
null' _  = False
λ null' []
True

λ null' [1,2,3]
False

λ null' ""
True

λ null' "Hello there"
False

λ null' [[]]
False

Parametrikus polimorfizmus: A függvény működése nem függ a tartalmazott elem(ek) típusától. (pl. a fenti null' függvény) AKA: Nincs típusmegkötés (type constraint)

Ad-hoc polimorfizmus: A függvény működése függ a bemeneti érték típusától. AKA Van típusmegkötés

hasAtLeastOne :: [a] -> Bool
hasAtLeastOne (x:xs) = False
hasAtLeastOne _ = True
exactly3Elements :: [a] -> Bool
exactly3Elements [_,_,_] = True
exactly3Elements (_:_:_:[]) = True -- Ez ugyanaz
exactly3Elements _ = False
h :: [[a]] -> Int
h [_, [], _] = 0
h _ = 1
j :: [(Integer,Char,c)] -> Int
j [(1, 'a', x),_,(_, 'b', _)] = 0
j _ = 1

Lista .. kifejezés (Ranges)

[1..10] -- számok 1-től 10-ig
[10,9..1] -- számok 10-től 1-ig
[1,3..10] -- páros számok 1-től 10-ig (10 nincs benne) 
[1..] -- összes szám 1-től (végtelen lista)

Listagenerátorok (List comprehension)

-- összes páros szám eggyel növelése
[x+1 | x <- xs, even x]
squaresTo100 :: [Integer]
squaresTo100 = [ x^2 | x <- [0..10] ]
tuples :: [(Integer, Integer)]
tuples = [(x, y) | x <- [1..3], y <- [100..103] ]
evens :: [Integer]
evens = [x | x <- [0..10], even x]