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:
[]
[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
A négy lehetséges alak:
Példa | Jelenté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']
.
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 ]
Á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.
Á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] ]
A típusozás szerepe
Fogalom | Angolul | Mit jelent? |
---|---|---|
Típusellenőrzés | type checking | x :: T teljesül-e? |
Típuslevezetés (típuskikövetkeztetés) | type inference | x :: ? |
Típusinhabitáció | type inhabitation | ? :: T |
Logikai értékek:
True :: Bool
False :: Bool
Karakterek:
'a' :: Char
'á' :: Char
A karaktersorozatokat külön névvel szoktuk illetni:
type String = [Char]
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
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
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
A típusváltozókat tetszőleges típusra cserélhetjük:
típus | specializált változatok |
---|---|
[a] | [Int] , [[Int]] , [b] , [[b]] , ... |
[a] -> a | [Char]->Char , [[b]]->[b] , ... |
(a,b) | ([Int],Char) , (a,a) , ... |
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),
...]
.
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] ]