Órai forráskód

--- 1. gyakorlat
-----

f(1) = A
f(2) = B
f(3) = C

------


f(1) = A
f(2) = A
f(3) = B

------

f(1) = A
f(1) = B
f(2) = C

------

1
2
1 + 2
(1 + 2) * 100 = 300

-------------


Melyik NEM függvény és miért?

f(x) = 1
f(z) = 2

g(X) = true
g(Y) = false
g(X) = false

h(1) = "hello"
h(3) = "world"
h(2) = "Haskell"

--- 2. gyakorlat
-----

-- masodik.hs
-- Windows parancsori értelmezők
-- powershell
-- cmd

-- Fájlok listázása: ls VAGY dir

-- ghci spéci parancsok
-- :l masodik.hs <- betöltés   (load)
-- :r            <- újratöltés (reload)
s = "Haskell is cool"

-- https://people.inf.elte.hu/poor_a/

inc n = n + 1

even' m = m `mod` 2 == 0

even'' m = mod m 2 == 0

-- Összehasonlító operátorok (függvények):
--   2 == 2  egyenlő
--   2 /= 3  nem egyenlő
--   2 >  1  nagyobb
--   2 >= 2  nagyobb vagy egyenlő


--  logikai operátorok (függvények):
--  True && True      logikai ÉS
--  True || False     logikai VAGY

-- Logikai ÉS művelet
-- True  ÉS True  -> True
-- True  ÉS False -> False
-- False ÉS True  -> False
-- False ÉS False -> False

-- Mintaillesztés:
and' True True = True
and' True False = False
and' False True = False
and' False False = False

and'' True True = True
and'' _    _    = False


--- 3. gyakorlat
-----
xor True True = False
xor True False = True
xor False True = True
xor False False = False

xor''''' False a = a
xor''''' True  a = not a

xor' a b = a /= b


{-
xor'' True False = True -- parciális függvény
xor'' False True = True
-}

xor'' True False = True -- totális függvény
xor'' False True = True
xor'' a     b    = False

{-
-- Nem jó, mert minden paraméternek különböző nevet kell adni
xor''' True False = True
xor''' False True = True
xor''' a     a    = False
-}

xor'''' True False = True -- totális függvény
xor'''' False True = True
xor'''' _     _    = False -- catch all minta: _

{-
xor'''' _     _    = False
xor'''' True False = True -- totális függvény
xor'''' False True = True
-}

------

-- Karakter minták

isA 'a' = True
isA 'A' = True
isA _ = False


-----------


fugven 42 12

a fugven z -> mod a z \= 0 -- rossz
fugven a z = mod a z /= 0  -- helyes
a `fugven` z =

--- 4. gyakorlat
-----

fun 'a' = "is"
fun 'x' = "interesting"
fun 'y' = "functional"
fun _   = "Haskell"

-----

Kérdések:

"Haskell"   "is"      "functional"

Parciális vagy totális? Miért?

-----

-- downloads.haskell.org

nextDay a
  | a < 0 = error "nextDay: input can't be negative"
  | a > 6 = error "nextDay: input can't be greater than 6"
  | a == 6 = 0
  | otherwise = a + 1  -- otherwise nem kötelező, helyette szerepelhetne a < 6 is (mert már csak az maradt ki)

-- ez is ugyanolyan jó:
nextDay a
  | a == 6 = 0
  | 0 <= a && a < 6 = a + 1
  | a < 0 = error "nextDay: input can't be negative"
  | a > 6 = error "nextDay: input can't be greater than 6"

--- Rekurzió

-- Nem jó:
-- fact :: Integer -> Integer
-- fact n = n * fact (n-1)       -- Rekurzív eset

-- Végtelen rekurzió:
-- Hiányzik a nem rekurzív alapeset
-- fact 2 -> 2 * fact 1 -> 2 * 1 * fact 0 -> 2 * 1 * 0 * fact (-1) ...

fact :: Integer -> Integer
fact 0 = 1                    -- Alapeset (nem rekurzív függvényág)
fact n = n * fact (n-1)       -- Rekurzív eset

--- 5. gyakorlat
-----

min' x y
  | x <= y  =  x
  | x >  y  =  y


------

min'' x y
  | x <= y  = x   -- ha elfogytak az őrfeltételek (mindegyik False volt), akkor megyünk a következő függvényágra
min'' x y         -- azaz ide
  | x > y   = y

--- 6. gyakorlat
-----

descending :: Int -> [Int]
descending n = list
  where                     -- segédváltozók és segédfüggvények
    list = [n, n-1 .. (-n)]

data Something = SomeInt Int | SomeString String -- új saját adatszerkezet