Egyenletrendszerek

Bevezető

Új függvényt egyenletrendszer megadásával definiálhatunk.

Először egyszerűbb példákat nézünk, aztán bonyolultabbakat.

Függvények definiálása egy egyenlettel

Egyparaméteres függvény definiálása:

f x = x + 1

Kétparaméteres függvény definiálása:

g a b = a * b + 1

Használat:

Test>
3 :: Integer

Az egyenletek bal oldalának alakja:
A definiálandó függvény neve, aztán a paraméterek (később látunk más lehetőséget is).

A függvény- és változónevek kisbetűvel kell kezdődniük.

Feladat: Hegy

Készítsünk egy függvényt ami minden n esetén visszaadja a következő listát: [1, 2, …, n-1, n, n-1, …, 2, 1]!

mountain :: Integer -> [Integer]

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

A két kettőspont után áll a függvény típusa (az értelmezési tartomány és az értékkészlet). A típusozással egyelőre nem foglalkozunk.

Feladat: Háromszög szerkeszthetősége

Döntsük el az a, b és c számokról, hogy lehetnek-e egy háromszög oldalhosszai!

areTriangleSides :: Double -> Double -> Double -> Bool

Test>
True :: Bool
Test>
False :: Bool

Feladat: Páros-e

Definiáljuk újra a Prelude-beli even függvényt, ami eldönti egy egész számról, hogy páros-e!

even :: Integer -> Bool

Test>
False :: Bool
Test>
True :: Bool

Feladat: Páratlan-e?

Definiáljuk újra a Prelude-beli odd függvényt, ami eldönti egy számról, hogy páratlan-e!

odd :: Integer -> Bool

Test>
True :: Bool
Test>
[True, False, True, False, True] :: [Bool]

Feladat: Oszthatóság

Definiáljuk az oszthatóságot!

divides :: Integer -> Integer -> Bool

Test>
True :: Bool
Test>
False :: Bool

Feladat: Szökőévek

Állapítsuk meg egy évről, hogy szökőév-e!

isLeapYear :: Integer -> Bool

Test>
[1952, 1956, 1960] :: [Integer]
Test>
False :: Bool
Test>
True :: Bool

Feladat: Osztók

Definiáljunk egy függvényt, ami egy listában előállítja egy szám osztóit!

divisors :: Integer -> [Integer]

Test>
[1, 2, 3, 4, 6, 12] :: [Integer]

Feladat: Valódi osztók

Definiáljunk egy függvényt, ami egy listába előállítja egy szám valódi osztóit!

properDivisors :: Integer -> [Integer]

Test>
[2, 3, 4, 6] :: [Integer]

Függvénydefiníció több egyenlettel

A logikai tagadás definíciója két egyenlettel megoldható:

not :: Bool -> Bool
not True  = False
not False = True

Függvényparaméterek helyett többek között a True és False értékek is szerepelhetnek.

Az olyan értékeket, amik szerepelhetnek függvényparaméterek helyett, konstruktoroknak nevezzük.

Logika ÉS definíciója

True  && True  = True
True  && False = False
False && True  = False
False && False = False

Logika ÉS egyszerűbben

True  && True  = True
_     && _     = False

Az aláhúzás azt jelenti hogy “bármi”.

Az egyenleteknek prioritásuk van, a számolás során egy egyenletet csak akkor használunk ha előbbi egyenletek nem használhatók.

Logikai ÉS másként:

True  && x     = x
_     && _     = False

Feladat: Logikai VAGY

Definiáljuk újra a (||) operátort.

Test>
True :: Bool
(||) :: Bool -> Bool -> Bool

Test>
True :: Bool
Test>
True :: Bool
Test>
True :: Bool
Test>
False :: Bool

Feladat: Kizáró VAGY

Definiáljuk a kizáró VAGY függvényt.

xor :: Bool -> Bool -> Bool

Test>
False :: Bool
Test>
True :: Bool
Test>
True :: Bool
Test>
False :: Bool

Párkonstruktor

Példák:

fst (a, b) = a
snd (a, b) = b

Használat:

Test>
2 :: Integer

Feladat: Elemcsere

Cseréljük meg egy pár két elemét!

swap :: (a, b) -> (b, a)

Test>
("hi", 3) :: ([Char], Integer)

Feladat: Tükrözés az x tengelyre

Tükrözzünk egy pontot az x tengelyre!

mirrorX :: (Double, Double) -> (Double, Double)

Test>
(3.0, -4.0) :: (Double, Double)

Feladat: Origó középpontú nagyítás

magnify t legyen origó középpontú t-vel történő nagyítás.

magnify :: Double -> (Double, Double) -> (Double, Double)

Test>
(15.0, 20.0) :: (Double, Double)

Feladat: Pontra tükrözés

Tükrözzük a második pontot az első pontra!

mirrorP :: (Double, Double) -> (Double, Double) -> (Double, Double)

Test>
(-4.0, -2.0) :: (Double, Double)
Test>
(-2.0, 0.0) :: (Double, Double)
Test>
(0.0, 8.0) :: (Double, Double)

Feladat: Két pont távolsága

Számoljuk ki két pont távolságát!

distance :: (Double, Double) -> (Double, Double) -> Double

Test>
True :: Bool

Az abszolút érték függvény:

Test>
40 :: Integer

A négyzetgyökvonás:

Test>
1.4142135623730951 :: Double

Lista konstruktorok

Üres lista: []
Egy elemű lista: [a]
Két elemű lista: [a, b]

Nem üres lista: a: b

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

Példák (Prelude függvények):

null :: [a] -> Bool
null [] = True
null _  = False
head :: [a] -> a
head (x:xs) = x
tail :: [a] -> [a]
tail (x:xs) = xs

Használat:

Test>
'h' :: Char
Test>
True :: Bool
Test>
"ello" :: [Char]

Feladat: 1 elemű-e a lista

Definiáljuk az “1 elemű-e a lista” függvényt mintaillesztéssel.

isSingleton :: [a] -> Bool

Test>
True :: Bool

Folytatás

folytatás következik