Esetszétválasztás

Esetszétválasztás

Guardsbcae25edfc0f86150396ca91d20218f3.png

min x y
    | x <= y    =  x
    | otherwise =  y

Eltérés a matematikai esetszétválasztástól:

Esetszétválasztás (2)

Szintaxis:

Szemantika: Az őrfeltételeket fentről lefelé vizsgáljuk, és az első teljesülő feltételnek megfelelő kifejezést választjuk.


A két definíció hasonlít, az eltérések a következők:

A szintaxis tehát a következő:

Az esetszétválasztás szemantikája: Az őrfeltételeket fentről lefelé vizsgáljuk. A végredmény az első igaz őrfeltétel melletti kifejezés lesz.

Az otherwise nem kulcsszó, hanem a Prelude modulban definiált konstans:

Test>

Feladat: Nagybetű-kisbetű

Definiáljunk az upperLower függvényt, amely kisbetűből nagybetűt csinál, és fordítva!

upperLower :: Char -> Char

Test>
'A' :: Char
Test>
't' :: Char
Test>
',' :: Char

Megjegyzés: A Data.Char modul importálása szükséges.

Feladat: Data.Char.digitToInt [*]

A következő függvény karaktereknek ad számértéket:

digitToInt :: Char -> Int

Test>
0 :: Int
Test>
9 :: Int
Test>
10 :: Int
Test>
15 :: Int
Test>
10 :: Int
Test>
⊥₁ :: Int
⊥₁: not a digit
CallStack (from HasCallStack):
  error, called at ./Guards.lhs:93:33 in main:Guards

Feladat: Négyzetre emelés

sqr :: Num a => a -> a

Test>
16 :: Integer

Feladat: (Prelude.^) [*]

Definiáljuk újra a (^) operátort (gyorshatványozás)!

Guards214b134722b2a00537dc126a44e9f3a6.png

(^) :: Num a => a -> Integer -> a

Test>
1 :: Integer
Test>
27 :: Integer
Test>
True :: Bool

Feladat: Kettes számrendszerbeli számjegyek

Legyen toBin az a függvény, amely visszaadja egy nemnegatív egész szám kettes számrendszerbeli számjegyeit fordított sorrendben!

Guardsb9495b51db8074570ffed11f2f8e1707.png

toBin :: Integer -> [Int]

Test>
[] :: [Int]
Test>
[1] :: [Int]
Test>
[0, 1] :: [Int]
Test>
[0, 1, 0, 1] :: [Int]

Mintaillesztéses esetszétválasztás: Prelude.drop [*]

Definiáljuk újra a Prelude modul drop függvényét! A drop n l jelentése: elhagyni az l lista elejéről n elemet.

drop :: Int -> [a] -> [a]

Test>
[4, 5, 6, 7, 8, 9, 10] :: [Integer]
Test>
[] :: [Integer]
Test>
[1, 2] :: [Integer]

Feladat: Prelude.take

Definiáljuk újra a Prelude modul take függényét! A take n l jelentése: meghagyni az l lista elejéről n elemet.

take :: Int -> [a] -> [a]

Test>
[1, 2, 3] :: [Integer]
Test>
[1, 2] :: [Integer]
Test>
[] :: [Integer]

Feladat: Data.List.insert [*]

Definiáljuk újra a List modulban definiált insert függvényt (elem beszúrása rendezett listába)!

insert :: Ord a => a -> [a] -> [a]

Test>
[3] :: [Integer]
Test>
[1, 2, 3, 5, 8] :: [Integer]
Test>
[1, 2, 5, 8, 10] :: [Integer]

Feladat: Rendezett összefésülés

Definiáljuk rendezett listák rendezett összefésülését!

sortMerge :: Ord a => [a] -> [a] -> [a]

Test>
[1, 2, 3, 4, 8, 10] :: [Integer]
Test>
[3, 4, 10] :: [Integer]

Feladat: Kombinációk

Állítsuk elő egy lista elemeinek az ismétlés nélküli kombinációit! (A lista elemeit tekintsük különbözőknek.)

combinations :: Int -> [a] -> [[a]]

Test>
[] :: [[Char]]
Test>
[[]] :: [[Char]]
Test>
["a", "b", "c", "d"] :: [[Char]]
Test>
["ab", "ac", "ad", "bc", "bd", "cd"] :: [[Char]]
Test>
["abc", "abd", "acd", "bcd"] :: [[Char]]
Test>
["abcd"] :: [[Char]]
Test>
[] :: [[Char]]
Test>
["a", "a"] :: [[Char]]

Feladat: Pakolás

Legyen n nemnegatív egész szám és xs nemnegatív egészek listája.

Válasszunk ki xs-ből számokat az összes lehetséges módon úgy, hogy a számok összege n legyen!

pack' :: Integral a => [a] -> a -> [[a]]

Test>
[[5, 7, 13], [3, 5, 17], [2, 5, 7, 11], [2, 3, 7, 13]] :: [[Integer]]