Második előadás

Operátorképzés függvényből

Kétargumentumos függvényt használhatunk operátorként is.

5 `div` 6  ==  div 5 6

Az így képzett operátor balra köt.

 100 `div`  10  `div` 2   ==  5
(100 `div` 10) `div` 2 == 5
100 `div` (10 `div` 2) == 20

Listák

Listák:

[]
[100, 100, 123, 33]
['a', 'b', 'c']
[True, False, True]

"abc" == ['a','b','c'] -- a szöveg karakterlista

Alapvető műveletek listákon:

head   [1,2,3]      ==  1      -- lista fejeleme
tail [1,2,3] == [2,3] -- lista farka
length [1,2,3] == 3 -- lista hossza
['a','b','c'] !! 0 == 'a' -- lista n-edik eleme

Intervallum-kifejezések

A négy lehetséges alak:

PéldaJelentés
[1..100]egész számok egytől százig
[1,3..100]páratlan számok egytől százig
[1..]természetes számok
[1,3..]páratlan számok

Bármire működik, ami felsorolható: ['a'..'z'].

Halmazkifejezések

Matematikai analógia: { n2 | n ∈ N, n páros }

[ n^2                -- generátum
| n <- [1..] -- generátor
, even n -- feltétel
]

A bevezetett nevek láthatósága visszafele nem terjed ki.

[ n^2 | n `mod` 2 == 0, n <- [1..] ]   -- hibás
[ n^2 | n <- [1..], n `mod` 2 == 0 ] -- ok

Tetszőlegesen sok generátor és feltétel adható meg, tetszőleges sorrendben.

[ [a,b] | a <- [0..100], b <- [0..a], a + b <= 100 ]

Példák

Állítsuk elő a 2 hatványait növekvő sorrendben tartamazó listát.

Melyik legkisebb n természetes számra igaz: 210n > 2 * 103n.

Prímszám-e 123457?

Állítsuk elő az [1,1,2,1,2,3,1,2,3,4,...] listát.

A példák megoldásai

Állítsuk elő a 2 hatványait növekvő sorrendben tartamazó listát.

[2^n | n <- [0..] ]

Melyik legkisebb n természetes számra igaz: 210n > 2 * 103n.

head [n | n <- [1..], 2 ^ (10 * n) > 2 * 10 ^ (3 * n) ]

Prímszám-e 123457?

length [n | n<-[1..123457], 123457 `mod` n == 0]  ==  2

Állítsuk elő az [1,1,2,1,2,3,1,2,3,4,...] listát.

[m | n <- [1..], m <- [1..n] ]

Típusozás

A típusozás szerepe

FogalomAngolulMit jelent?
Típusellenőrzéstype checkingx :: T teljesül-e?
Típuslevezetés (típuskikövetkeztetés)type inferencex :: ?
Típusinhabitációtype inhabitation? :: T

Alapvető típusok

Logikai értékek:

True  :: Bool
False :: Bool

Karakterek:

'a' :: Char
'á' :: Char

A karaktersorozatokat külön névvel szoktuk illetni:

type String = [Char]

N-esek

A párok két tetszőleges típusú elemet tartalmazhatnak. Vannak hármasok, négyesek stb.

(False, 'c')             :: (Bool, Char)
("Hello", "World") :: (String, String)
[(True,'c'),(False,'x')] :: [(Bool, Char)]
('a', True, "b") :: (Char, Bool, String)

Két fontos függvény:

fst   :: (a,b) -> a     -- pár első eleme
snd :: (a,b) -> b -- pár második eleme

Függvénytípus

Az N argumentumú függvény típusa:
t1 -> t2 -> ... -> tN -> tN+1.

Példák:

not  :: Bool -> Bool            -- tagadás
(&&) :: Bool -> Bool -> Bool -- logikai És
(||) :: Bool -> Bool -> Bool -- logikai Vagy

Általános polimorfizmus

A lista típus polimorf:

[True, False]  :: [Bool]
['a','b','c'] :: [Char]
[] :: [a]
[[]] :: [[a]]

Két polimorf függvény és két polimorf operátor:

length :: [a] -> Int        -- lista hossza
take :: Int -> [a] -> [a] -- lista első n eleme
(!!) :: [a] -> Int -> a -- lista n-edik eleme
(++) :: [a] -> [a] -> [a] -- két lista összefűzése

Típusspecializáció

A típusváltozókat tetszőleges típusra cserélhetjük:

típusspecializált változatok
[a][Int], [[Int]], [b], [[b]], ...
[a] -> a[Char]->Char, [[b]]->[b], ...
(a,b)([Int],Char), (a,a), ...

Példák

Ellenőrizzük minden x, y számra 1 és 10 között:

x `mod` y  ==  x `rem` y
and    :: [Bool] -> Bool    -- logikai És több elemre

Sorszámozzuk meg az "abcd" szöveg karaktereit.

zip   :: [a] -> [b] -> [(a,b)]  -- összefűzés
unzip :: [(a,b)] -> ([a], [b]) -- szétfűzés

Soroljuk fel a természetes számpárokat: [(0,0),(0,1),(1,0),(0,2),(1,1),(2,0), ...].

A példák megoldásai

Ellenőrizzük minden x, y számra 1 és 10 között:

x `mod` y  ==  x `rem` y
and  [x `mod` y  ==  x `rem` y  | x<-[1..10], y<-[1..10]]

Sorszámozzuk meg az "abcd" szöveg karaktereit.

zip "abcd" [1..length "abcd"]

Soroljuk fel a természetes számpárokat: [(0,0),(0,1),(1,0),(0,2),(1,1),(2,0), ...].

[(b, a - b) | a <- [0..], b <- [0..a] ]