Tartalom előadás
|
|
- Zoltán Vass
- 6 évvel ezelőtt
- Látták:
Átírás
1 HASKELL
2 Tartalom 1 HS előadás Bevezetés A mint funkcionális nyelv típusok és értékek függvények és operátorok adatkonstruktorok tulajdonságai mintaillesztés, őrök vezérlési szerkezetek a forráskód beosztása A mint lusta nyelv végtelen adatszerkezetek fenékérték szigorú kiértékelés kikényszerítése listák építése
3 Tartalom 2 HS előadás A típusnyelv kiterjesztése típusosztályok, többszörös terhelés beépített típusosztályok származtatás számok kezelése Peano-számok megvalósítása többargumentumú típusosztályok A modulnyelve
4 Tartalom 3 HS előadás Imperatív elemek a ben hibakezelés állapotkezelés állapotkezelés hibakezeléssel kombinálva monádok a do jelölés imperatív stílusú programozás monádok aritmetikája a lista mint monád a Monad könyvtár ki- és bevitel A programozó evolúciója (Fritz Ruehr)
5 BEVEZETÉS
6 Bevezetés Bevezetés HS1-6 A eredete Brooks Curry matematikus tiszteletére (v.ö.: curry és uncurry) 1987: az első cél: egy szabványos, lusta kiértékelésű, tisztán funkcionális nyelv 1999: 98 lényegében azonos a 1.4-gyel Interaktív környezetek Hugs kicsi és gyorsan fordít, tanuláshoz ideális GHC nagyobb, sok kiegészítővel, nagyon gyors kódot fordít Források, irodalom.org A Gentle Introduction to (Paul Hudak, John Peterson, Joseph H. Fasel) 98 Report & Library Report
7 A HASKELL MINT FUNKCIONÁLIS NYELV
8 Típusok és értékek 1 A mint funkcionális nyelv HS1-8 Szintaktika névadás egyenlet formájában: Church-féle típus megkötés: név = érték név érték [, név érték...] :: típus a típus- és adatkonstruktorok nagybetűvel kezdődnek, és prefix pocícióban állnak Egyszerű típusok logikai értékek: True :: Bool egész számok korlátos: 5 :: Int BigNum : :: Integer lebegőpontos számok egyszeres pontosságú: :: Float dupla pontosságú: :: Double karakterek: c :: Char
9 Típusok és értékek 2 A mint funkcionális nyelv HS1-9 Összetett (polimorfikus) típusok listák: füzérek: ennesek: függvények: Felhasználói típusok típusszinoníma 3:6:1:2:[] == ([3,6,1,2] :: [Integer]) "haskell" == ([ h, a, s, k, e, l, l ] :: [Char]) ( a, 1.23, True) :: (Char, Double, Bool) take :: Int -> [a] -> [a] meglévő (összetett) típusok rövid neve a típusnév bárhol felcserélhető a definicíójával type String = [Char] típuskonstruktor erős absztrakciót valósít meg mintaként illeszthető data Bool = True False data Tree a = Leaf Node a (Tree a) (Tree a)
10 Típusok és értékek 3 A mint funkcionális nyelv HS1-10 Beépített típuskonstruktorok rendezettség: feltételes típus: data Ordering = LT EQ GT data Maybe a = Nothing Just a diszjunktív unió: data Either a b = Left a Right b Felhasználói típusok (folyt) fedőtípus a típusszinonímához hasonlóan egy meglévő típus átnevezése a típuskonstruktorhoz hasonlóan erős absztrakció, illeszthető mintaként nincs plusz memóriaigény, csak a típusellenőrzéskor van szerepe newtype Natural = Natural Integer Natural 15 :: Natural
11 Típusok és értékek 4 A mint funkcionális nyelv HS1-11 Felhasználói típusok (folyt) mezőnevek egy adatkonstruktor argumentumai elnevezhetőek data Tree a = L N { value :: a, left :: Tree a, right :: Tree a } adatstruktúra megadása, mintaillesztés: N 1 L L N { value = 1, left = L, right = L } kiválasztó függvények: value :: Tree a -> a left, right :: Tree a -> Tree a value (N 1 L L) == 1 a hibás használat csak futási időben derül ki: value L értékelfedés: (N 1 L L) { value = 2 } == N 2 L L
12 Függvények és operátorok 1 A mint funkcionális nyelv HS1-12 Lambda függvények \arg1 [arg2...] -> törzs \x -> \y -> x+y \x y -> x+y Nevesített függvények a típusmegkötés explicit módon megadható általában curried alakúak (ld. operátorok) -- add x y = x és y összege add :: Integer -> Integer -> Integer add x y = x+y -- ugyanaz, mint: add = \x y -> x+y Operátorok kétargumentumú, curried függvények ha a függvény neve szimbólumokból áll, akkor operátor, ha alfanumerikus, akkor prefix függvény
13 Függvények és operátorok 2 A mint funkcionális nyelv HS1-13 Operátorok (folyt) (.) :: (b -> c) -> (a -> b) -> (a -> c) f. g = \x -> f (g x) f. g x = f (g x) szintaktikusan hibás! (v.ö.: kétargumentumú) szeletek (sections) az operátorok is részlegesen alkalmazhatóak (x+) = \y -> x+y (+y) = \x -> x+y (+) = \x y -> x+y (az operátorok prefix alakja) `add` a függvények infix alakja: 3 `add` 4 == 5 kötés megadása balra kötő: infixl 6 * jobbra kötő: infixr 3 && nem kötő: infix 4 /= alapértelmezés: infixl 9
14 Adatkonstruktorok tulajdonságai A mint funkcionális nyelv HS1-14 Infix adatkonstruktorok a neve csak szimbólumokból áll, és kettősponttal kezdődik ugyanúgy van precedenciája, mint az infix függvényeknek pl. tört definiálása: data Fraction = Integer :/ Integer 3 :/ 5 :: Fraction Adatkonstruktorok, mint függvények az adatkonstruktorok függvényként is használhatók map Just [1,2] == ([Just 1, Just 2] :: [Maybe Integer]) ez igaz az ennesre is! (,) True x == (True, x ) (,,) "ok" 2 :: a -> (String, Integer, a)
15 Mintaillesztés, őrök A mint funkcionális nyelv HS1-15 Mintaillesztés Őrök bármely adatkonstruktor használható mintában alternatív mintákat több egyenlettel adunk meg _ : univerzális minta, mindenre illeszkedik réteges minta: minta take :: Int -> [a] -> [a] take 0 _ = [] take _ [] = [] take n (x:xs) = x : take (n-1) xs nem minden eset választható szét mintákkal őr = a klóztörzs kiértékelhetőségének feltétele compare x y x == y = EQ x <= y = LT otherwise = GT
16 Vezérlési szerkezetek 1 A mint funkcionális nyelv HS1-16 Esetszétválasztás mintaillesztéses esetszétválasztás take :: Int -> [a] -> [a] take m xs = case (m,xs) of (0,_) -> [] (_,[]) -> [] (m,x:xs) -> x : take (m-1) xs feltételes kifejezés max x y = if x >= y then x else y szintaktikus édesítőszer: if e then e1 else e2 ekvivalens alakja: case e of True -> e1 False -> e2
17 Vezérlési szerkezetek 2 A mint funkcionális nyelv HS1-17 Lokális érvényű deklarációk let-kifejezés a deklarációk egy kifejezésen belül érvényesek distance (x1,y1) (x2,y2) = let xd = x1-x2 yd = y1-y2 in sqrt(xd*xd + yd*yd) where-deklaráció a deklarációk egy (esetleg több őrzött esetből álló) deklaráción belül érvényesek tipikusan segédfüggvény definiálásakor használjuk gcd x y = gcd (abs x) (abs y) where gcd x 0 = x gcd x y = gcd y (x `rem` y)
18 A forráskód beosztása (layout) A mint funkcionális nyelv HS1-18 Mi választja el az egyes deklarációkat, kifejezéseket egymástól? Ekvivalens-e a következő két kifejezés: let y = a*b let y = a*b f f x = (x+y)/y x = (x+y)/y in f c + f d in f c + f d A válasz: beosztás (layout), azaz a forráskód kétdimenziós elrendezése: alapvetően intuitív, könnyen olvasható; a where, let, of kulcsszók utáni első nemszóköz karakter határozza meg a deklarációk ill. minták kezdőoszlopát; egy beágyazott blokk kezdőoszlopa mindig beljebb legyen, mint a beágyazó blokké; egy deklarációnak, kifejezésnek vége, ha valami a blokk kezdőoszlopától balra kezdődik. A tagolás explicit módon is megadható: { ; }, pl. ha több deklarációt szeretnénk egy sorba írni. let { y = a*b let y = a*b; f x = (x+y)/y ; f x = (x+y)/y in f c + f d } in f c + f d
19 A HASKELL MINT LUSTA NYELV
20 Kérdés A mint lusta nyelv HS1-20 Mi a különbség a függvények és a nemfüggvény értékek között?
21 Válasz A mint lusta nyelv HS1-21 Semmi! nemfüggvény érték = argumentum nélküli függvény
22 Végtelen adatszerkezetek A mint lusta nyelv HS1-22 Deklaráció egyesek végtelen listája: egészek n-től felfelé: ones = 1 : ones upfrom n = n : upfrom (n+1) négyzetszámok: squares = map (^2) (upfrom 0) Fibonacci sorozat 1. változat fib = 1 : 1 : fib +: (tail fib) where (x:xs) +: (y:ys) = x+y : xs +: ys Fibonacci sorozat 2. változat (_:tfib) = 1 : 1 : zipwith (+) fib tfib Felhasználás take 5 ones == [1,1,1,1,1] take 7 squares == [0,1,4,9,16,25,36] take 10 fib == [1,1,2,3,5,8,13,21,34,55]
23 Fenékérték 1 A mint lusta nyelv HS próbálkozás bot = bot Mi a típusa? bot :: a ha kiértékeljük, végtelen ciklusba esünk 2. próbálkozás bot False = bot Mi a típusa? bot :: a ha kiértékeljük, futási hibát kapunk jelölése: (ejtsd: fenékérték vagy bottom) az okozott hiba fatális, a program leáll ha nem értékeljük ki, nem okoz gondot: (\x -> 1) bot == 1 a Standard Prelude-ben undefined-nak hívják
24 Fenékérték 2 A mint lusta nyelv HS1-24 Hibajelzés visszaadása: jó, de nem túl bőbeszédű error hibajelző függvény error :: String -> a head :: [a] -> a head (x:_) = x head [] = error "head{preludelist}: head []" szemantikai értelemben az error függvény értéke
25 Szigorú kiértékelés kikényszerítése A mint lusta nyelv HS1-25 Szigorú adatkonstruktorok általában előfordulhat, hogy egy adatszerkezet egy részét soha nem értékeljük ki fst ("ok", undefined) == "ok" időnként szemantikailag indokolt lehet csak teljesen kiértékelhető struktúrák megengedése data Fraction =!Integer :/!Integer (\(x :/ y) -> x) (1 :/ undefined) = undefined növeli a hatékonyságot Szigorú kiértékelés f $! x hívás x legfelső szintjét kiértékeli, és alkalmazza rá f-et (\x -> 1) undefined == 1 (\x -> 1) $! undefined = undefined (\x -> 1) $! (undefined, undefined) == 1
26 Listák építése 1 A mint lusta nyelv HS1-26 Listanézet (List Comprehension) a listaépítés és -transzformálás tömör, kifejező formája lefedi a map és a filter függvényeket, és még sokkal többet általános alak: [ elemkif minta <- listakif, őrkif,... ] map f xs = [ f x x <- xs ] filter p xs = [ x x <- xs, p x ] összes lehetséges pár (Descartes-szorzat): cartesian :: [a] -> [b] -> [(a,b)] cartesian xs ys = [ (x,y) x <- xs, y <- ys ] cartesian [1,2] [ a, b ] == [(1, a ),(1, b ),(2, a ),(2, b )] gyorsrendezés a lehető legtömörebben quicksort [] = [] quicksort (x:xs) = quicksort [ y y <- xs, y < x ] ++ x : quicksort [ y y <- xs, y >= x ]
27 Listák építése 2 A mint lusta nyelv HS1-27 Listanézet (folyt) Fibonacci sorozat 3. változat fib = 1 : 1 : [ a+b (a,b) <- zip fib tfib ] where _:tfib = fib Számtani sorozatok számtani sorozat függvénnyel fromthento n n m = nn m where nn m = takewhile p (n : map ((n -n) +) nn m) p n >= n = (m >=) otherwise = (m <=) fromthento == [1,3,5,7,9] számtani sorozat szintaktikai édesítőszerrel [3..15] == [3,4,5,6,7,8,9,10,11,12,13,14,15] [ a, c.. f ] == "ace" [0.0, 1.1..] = [0.0, 1.1, 2.2, 3.3,...] végtelen lista
28 A TÍPUSNYELV KITERJESZTÉSE
29 Típusosztályok, többszörös terhelés 1 A típusnyelv kiterjesztése HS2-29 A polimorfizmus változatai Paraméteres ~: ez a megszokott, típusváltozót használó. Az elvégzendő művelet mindig ugyanaz, nem (teljesen) használja ki az argumentum típusát. Ad-hoc ~: közismertebb néven többszörös terhelés vagy overloading. Itt csak a szintaktika azonos, a számítás teljesen különböző lehet minden típusra. Például Jó hír: az 1, 2,... állandók jelenthetnek egész és lebegőpontos számokat is az aritmetikai operátorok, mint a + vagy a * sokféle számtípuson működnek az egyenlőségvizsgáló operátorok, mint a == és az /= nagyon sokféle típusra működnek a ben a felhasználó is definiálhat többszörösen terhelt függvényeket, sőt, a meglévő, többszörösen terhelt függvényeket kiterjesztheti újabb típusokra. Mi a member_of függvény típusa? x `member_of` [] = False x `member_of` (y:ys) = x == y x `member_of` ys Nem egyszerűen a -> [a] -> Bool!
30 Típusosztályok, többszörös terhelés 2 A típusnyelv kiterjesztése HS2-30 Típusosztály, példány, kontextus egy típus példánya egy típusosztálynak, ha a típushoz tartozó értékekre alkalmazható a típusosztályba tartozó összes függvény például: egyenlőségi osztály class Eq a where (==), (/=) :: a -> a -> Bool Eq a fejezi ki azt a kényszert, hogy az a típusnak az Eq osztály egy példányának kell lennie egy típuskifejezésre vonatkozó kényszert a kifejezés kontextusának nevezzük (==) :: Eq a => a -> a -> Bool ez alapján: példányosítás: member_of :: Eq a => a -> [a] -> Bool data Fraction =!Integer :/!Integer instance Eq Fraction where (a:/b) == (x:/y) = a*y == x*b (3 :/ 5 == 6 :/ 10) == True
31 Típusosztályok, többszörös terhelés 3 A típusnyelv kiterjesztése HS2-31 További kontextusok lehet (kell, hogy legyen) kontextusa a példányosításnak: data Tree a = Leaf Node a (Tree a) (Tree a) instance Eq a => Eq (Tree a) where Leaf == Leaf = True Node v1 l1 r1 == Node v2 l2 r2 = (v1,l1,r1) == (v2,l2,r2) _ == _ = False lehet saját kontextusa az egyes metódusoknak: class MyClass a where method :: Eq b => b -> b -> a Alapértelmezett metódusmegvalósítás class Eq a where (==), (/=) :: a -> a -> Bool -- Minimal complete definition: (==) or (/=) x == y = not (x/=y) x /= y = not (x==y)
32 Típusosztályok, többszörös terhelés 4 A típusnyelv kiterjesztése HS2-32 Öröklődés a típusosztályok öröklődés útján kiterjeszthetőek class Eq a => Ord a where compare :: a -> a -> Ordering (<), (<=), (>=), (>) :: a -> a -> Bool max, min :: a -> a -> a compare x y x==y = EQ x<=y = LT otherwise = GT a kontextusban elegendő az alosztályt megadni, az ősosztály kiírása redundáns quicksort :: Ord a => [a] -> [a] a többszörös öröklődés megengedett, de a szokásos problémák nem jönnek elő, mivel egy név csak egy osztályba tartozhat, azaz átfedés eleve nem lehet class (A a, B a) => C a where...
33 Típusosztályok, többszörös terhelés 5 A típusnyelv kiterjesztése HS2-33 Típusoperátorok osztályai egy típusosztály nem csak típusállandók, hanem típusoperátorok osztálya is lehet class Functor f where fmap :: (a -> b) -> (f a -> f b) instance Functor Tree where fmap f Leaf = Leaf fmap f (Node v l r) = Node (f v) (fmap f l) (fmap f r) instance Functor [] where fmap = map instance Functor Maybe where fmap f Nothing = Nothing fmap f (Just x) = Just (f x)
34 Beépített típusosztályok 1 A típusnyelv kiterjesztése HS2-34 Eq a, Eq a => Ord a és Functor f már ismert korlátossági osztály class Bounded a where minbound, maxbound :: a enumerációs osztály számtani sorozatok létrehozásához class Enum a where succ, pred :: a -> a toenum :: Int -> a fromenum :: a -> Int enumfrom :: a -> [a] -- [n..] enumfromthen :: a -> a -> [a] -- [n,m..] enumfromto :: a -> a -> [a] -- [n..m] enumfromthento :: a -> a -> a -> [a] -- [n,n..m] monadikus osztály: Monad, lásd később számosztályok, lásd később
35 Beépített típusosztályok 2 A típusnyelv kiterjesztése HS2-35 A Show típusosztály értékek füzérré alakítására szolgál (kiíráshoz) show (2, a ) == "(2, a )" fa kiírása: showtree :: Show a => Tree a -> String showtree Leaf = "<>" showtree (Node v l r) = "<" ++ showtree l ++ " " ++ show v ++ " " ++ showtree r ++ ">" Ezzel az a gond, hogy a költsége négyzetes, mivel ++ költsége arányos a lista hosszával. fa kiírása gyűjtőargumentummal: showstree :: Show a => Tree a -> String -> String showstree Leaf = ("<>"++) showstree (Node v l r) = ( < :). showstree l. ( :). shows v. ( :). showstree r. ( > :)
36 Beépített típusosztályok 3 A típusnyelv kiterjesztése HS2-36 A Show típusosztály (folyt) hozzáíró függvény (showing function): primitív hozzáíró függvények: ( :), ("<>"++) showstree fából hozzáíró függvényt állít elő showstree :: Show a => Tree a -> ShowS class Show a where show :: a -> String showsprec :: Int -> a -> ShowS showlist :: [a] -> ShowS type ShowS = String -> String showsprec első argumentuma a különböző precedenciaszintek kezeléséhez showlist azért, hogy a lista a szokásostól eltérő alakban is megjelenhessen, ld. String instance Show a => Show (Tree a) where showsprec _ = showstree instance Show a => Show [a] showsprec _ = showlist where
37 Származtatás A típusnyelv kiterjesztése HS2-37 Típusosztály példányainak automatikus származtatása bizonyos típusosztályok példányainak megírása unalmas, mechanikus munka az ilyen osztályok példányai automatikusan előállíthatók data Tree a = Leaf Node a (Tree a) (Tree a) deriving (Eq, Ord, Show) Eq származtatása: az intuíciónak megfelelő Ord származtatása: lexikografikus sorrend, balról jobbra Show származtatása: a szintaktikának megfelelő kiírás
38 Számok kezelése 1 A típusnyelv kiterjesztése HS2-38 A által ismert, beépített számtípusok véges és korlátlan egészek egész típusokból képzett arányok, racionális számok egyszeres- és dupla pontosságú, valós és komplex lebegőpontos számok Ezek a típusok az átjárhatóság kedvéért típusosztályok hierarchiájába vannak szervezve. A Num osztály minden számosztály őse azokat a műveleteket adja, amelyeknek minden számra értelmesnek kell lennie ha egy típus a példánya, akkor alapvető aritmetikai műveletek már végezhetők az értékein class (Eq a, Show a) => Num a where (+), (-), (*) :: a -> a -> a negate :: a -> a -- the - prefix operator abs, signum :: a -> a frominteger :: Integer -> a fromint :: Int -> a
39 Számok kezelése 2 A típusnyelv kiterjesztése HS2-39 Az Integral osztály egész számok ábrázolására példányai az Int és Integer típusok class (Real a, Enum a) => Integral a where quot, rem, div, mod :: a -> a -> a quotrem, divmod :: a -> a -> (a,a) even, odd :: a -> Bool tointeger :: a -> Integer toint :: a -> Int A Fractional osztály törtek és lebegőpontos számok ábrázolására szolgáló ősosztály class (Num a) => Fractional a where (/) :: a -> a -> a recip :: a -> a fromrational :: Rational -> a fromdouble :: Double -> a
40 Számok kezelése 3 A típusnyelv kiterjesztése HS2-40 A Floating osztály a Fractional osztály leszármazottja lebegőpontos számok ábrázolására példányai a Float és Double típusok metódusai szögfüggvények és -konstansok Arányok ábrázolása a Fractional osztály példánya a Ratio típus az Integral osztály példányaiból képes arányokat létrehozni absztrakt adattípus az arányok ábrázolásához: data Integral a => Ratio a =!a :%!a deriving (Eq) típusszinoníma a racionális számokhoz: absztrakt adattípus, ezért a :% adatkonstruktor nem látszik ki (%) :: Integral a => a -> a -> Ratio a 3 % 6 = 1 % 2 type Rational = Ratio Integer
41 Számok kezelése 4 A típusnyelv kiterjesztése HS2-41 Kényszerítők és többszörösen terhelt konstansok a számtípusok közötti átjárásra több konverziós, kényszerítő (coercion) függvény szolgál frominteger :: (Num a) => Integer -> a fromrational :: (Fractional a) => Rational -> a fromintegral :: (Integral a, Num b) => a -> b tointeger :: (Integral a) => a -> Integer torational :: (RealFrac a) => a -> Rational a kettőt ezek közül implicit konverzióra használ a számkonstansokhoz 3 :: Integer = 3 3 :: Double = :: Rational = 3 % 1 a számkonstansok típusa csak kontextussal adható meg 3 :: Num a => a 3.0 :: Fractional a => a 3 % 5 :: Integral a => Ratio a
42 Peano-számok megvalósítása 1 A típusnyelv kiterjesztése HS2-42 Az adattípus deklarációja data Peano = Zero Succ Peano deriving (Eq, Ord, Show) A Num osztályba tartozás instance Num Peano where Zero + m = m Succ n + m = n + Succ m n - Zero = n Succ n - Succ m = n - m Zero - m = error "Peano.(-): negative number" abs = id signum n = 1 frominteger 0 = Zero frominteger n n > 0 = Succ (frominteger (n-1))
43 Peano-számok megvalósítása 2 A típusnyelv kiterjesztése HS2-43 Az Integral osztályba tartozás előkészítése instance Real Peano where torational = torational. tointeger A tointeger függvényt az Integral osztály adja. A lusta kiértékelése miatt használhatjuk fel előre. instance Enum Peano where succ n = Succ n pred Zero = error "Peano.pred: negative number" pred (Succ n) = n toenum fromenum = fromint = toint A fromint a Num osztály, a toint az Integral osztály metódusa. Az Enum osztály többi függvényének van alapértelmezett megvalósítása. Ha a hatékonyság cél lenne, külön meg kellene őket valósítani.
44 Peano-számok megvalósítása 3 A típusnyelv kiterjesztése HS2-44 Az Integral osztályba tartozás instance Integral Peano where n `quotrem` Zero = error "Peano.quotRem: division by zero" n `quotrem` d = qr n d Zero n where qr Zero Zero q r = (Succ q, Zero) qr Zero d q r = (q, r) qr n Zero q r = qr n d (Succ q) n qr (Succ n) (Succ d) q r = qr n d q r tointeger Zero = 0 tointeger (Succ n) = 1 + tointeger n A többi metódus vissza van vezetve a quotrem függvényre.
45 Többargumentumú típusosztályok 1 A típusnyelv kiterjesztése HS többargumentumú függvények többargumentumú adatkonstruktorok többargumentumú típuskonstruktorok egyargumentumú típusosztályok A típusosztályoknak is lehessen több típusargumentuma! Ez nem része a 98 szabványnak, de több interpreterben (Hugs, GHC) megtalálható kiegészítésként. Definiálás, alkalmazás Tfh. szeretnénk egy gyűjtő osztályt: class Collects e ce where... felhasználási lehetőségek: instance Eq e => Collects e [e] where... instance Eq e => Collects e (e -> Bool) where... instance Collects Char BitSet where...
46 Többargumentumú típusosztályok 2 A típusnyelv kiterjesztése HS2-46 Többértelműségi probléma class Collects e ce where empty :: ce insert :: e -> ce -> ce member :: e -> ce -> bool problémák: a típusellenőrzés túl szigorú: empty :: Collects e ce => ce Az e típusváltozó nem határozható meg! a típus nem eléggé szigorú: f x y = insert x. insert y f True a :: (Collects Bool c, Collects Char c) => c -> c Csak futási idejű hibát okoz!
47 Többargumentumú típusosztályok 3 A típusnyelv kiterjesztése HS2-47 Típusoperátorok osztálya class Collects e c where empty :: c e insert :: e -> c e -> c e member :: e -> c e -> bool megoldott problémák: empty :: Collects e c => c e nem többértelmű f :: (Collects e c) => e -> e -> c e -> c e nem engedi meg a f True a jellegű felhasználást instance Collects e [] were... rossz hír: a másik két felhasználási ötlet nem működik: e -> Bool és a BitSet nem típusoperátorok
48 Többargumentumú típusosztályok 4 A típusnyelv kiterjesztése HS2-48 Explicit típusfüggőség az osztály egyes típusparaméterei egyértelműen meghatároznak másokat függőségek megadásával írható le általános alak: x1 x2... xn -> y1 y2... ym, n > 0,m 0 egy osztályhoz több függőség is megadható class Collects e ce ce -> e where... redundáns, nem megengedett függőségek: a -> a a -> a a a -> a -> b, b -> c, a -> c korlátozza a példányosítást megoldja a felmerült problémákat
49 Többargumentumú típusosztályok 5 A típusnyelv kiterjesztése HS2-49 Típusnyelvi programozás írhatunk programot a típusellenőrzőre adataink típusok, nem értékek Prologszerű számítási modell példa: számábrázolás és műveletek data Zero data Succ n type One = Succ Zero; type Two = Succ One zero = undefined :: Zero; one = undefined :: One class Add a b c a b -> c where add :: a -> b -> c instance Add Zero b b instance Add a b c => Add (Succ a) b (Succ c) add one one :: Succ (Succ Zero)
50 A HASKELL MODULNYELVE
51 A modulnyelve 1 A modulnyelve HS2-51 egy program modulokból épül fel kettős cél: névtér felosztása absztrakt adattípusok létrehozása a modul törzse deklarációkból áll a modulnév alfanumerikus, és nagybetűvel kezdődik a modulok és az állományok között nincs szigorú kapcsolat (egy modul több file-ban, egy file-ban több modul megengedett) általános alak: module Modulnév (exportlista) where deklarációk az exportlista elhagyható, ilyenkor minden kilátszik module Tree ( Tree(Leaf,Node), isleaf ) where data Tree a = Leaf Node a (Tree a) (Tree a) deriving (Eq, Ord, Show) isleaf :: Tree a -> Bool isleaf Leaf = True isleaf _ = False
52 A modulnyelve 2 A modulnyelve HS2-52 Tree(Leaf,Node) helyett írható Tree(..) megengedett az adatkonstruktorok csak egy részét exportálni szabad továbbexportálni importált neveket importálás: import Modulnév (importlista) csak a modul legelején állhat az importlista elhagyható, ilyenkor minden exportált nevet importál minősített nevek: Modulnév.név importálás megnyitás nélkül: import qualified Modulnév explicit elrejtés: import Tree hiding isleaf átnevezés: import Tree as T Prelude implicite importált, de explicit importálással felülbírálható: import qualified Prelude as P hiding length típusosztályok példányai automatikusan exportálódnak és importálódnak
53 IMPERATÍV ELEMEK A HASKELLBEN
54 Monádok 0 Imperatív elemek a ben HS3-54 (Avagy: a monádok nem nomádok) bölcsőjük a kategóriaelmélet és a 1960-as évek monád monoid vagy félcsoport (zárt, asszociatív, egységelemes, de nincs inverz) a funkcionális programozásban alkalmas eszköz mellékhatások kezelésére: állapotok kivételkezelés ki- és bevitel nemdeterminizmus a ben egy monád egy típusoperátor a minimálisan elvárt műveleteket a Monad osztály adja ismertetések: What the hell are Monads? (Noel Winstanley) Monads for the Working Programmer (Theodore Norvell)
55 Hibakezelés 1 Imperatív elemek a ben HS3-55 Bizonyos számításoknál nem mindig adható értelmes eredmény (v.ö.: füzér számmá alakítása). Ilyenkor az eredményt becsomagoljuk egy feltételes típusba (Maybe a). Tfh. van egy adatbáziskezelő könyvtárunk egy lekérdezőfüggvénnyel: doquery :: Query -> DB -> Maybe Record Több lekérdezésből álló szekvencia: r :: Maybe Record r = case doquery db q1 of Nothing -> Nothing Just r1 -> case doquery db (q2 r1) of Nothing -> Nothing Just r2 -> case doquery db (q3 r2) of Nothing -> Nothing Just r3 ->... Hátrányok: sokszor kell leírni ugyanazt nem jól olvasható
56 Hibakezelés 2 Imperatív elemek a ben HS3-56 Ötlet: vezessünk be egy kombinátort, ami elrejti ezt a mintázatot! thenmb :: Maybe a -> (a -> Maybe b) -> Maybe b mb `thenmb` f = case mb of Nothing -> Nothing Just a -> f a A lekérdezési szekvencia kombinátorral felírva: r :: Maybe Record r = doquery q1 db `thenmb` \r1 -> doquery (q2 r1) db `thenmb` \r2 -> doquery (q3 r2) db `thenmb`... Előnyök: átláthatóbb, olvashatóbb kód típusa, viselkedése nem változott
57 Állapotkezelés 1 Imperatív elemek a ben HS3-57 Bizonyos számításoknál egy állapotot kell láncszerűen végigadogatni a függvények egy sorozatának. Az ilyen függvényeket állapottranszformátoroknak nevezzük: type StateT s a = s -> (a,s) Tfh. az adatbázisunkat módosítani is akarjuk: addrec :: Record -> DB -> (Bool,DB) delrec :: Record -> DB -> (Bool,DB) vagy ugyanez a fenti típusszinonimával leírva: addrec :: Record -> StateT DB Bool delrec :: Record -> StateT DB Bool A használatuk: newdb :: StateT DB Bool newdb db = let (ok1,db1) = addrec rec1 db (ok2,db2) = addrec rec2 db1 (ok3,db3) = delrec rec3 db2 in (ok1 && ok2 && ok3, db3) Számos hibalehetőség!
58 Állapotkezelés 2 Imperatív elemek a ben HS3-58 Ötlet: használjunk itt is kombinátort! thenst :: StateT s a -> (a -> StateT s b) -> StateT s b st `thenst` f = \s -> let (v,s ) = st s in f v s Ez összekombinál egy állapottranszformátort és egy állapottranszformátort előállító függvényt. Az eredmény visszaadásához szükség van még egy kombinátorra: returnst :: a -> StateT s a returnst a = \s -> (a,s) Ez egy értéket beemel egy identitás-állapottranszformátorba. Az előző adatbázismódosítás a kombinátorokkal felírva: newdb :: StateT DB Bool newdb = addrec rec1 `thenst` \ok1 -> addrec rec2 `thenst` \ok2 -> delrec rec3 `thenst` \ok3 -> returnst (ok1 && ok2 && ok3) Elrejtettük az állapotargumentum körbeadogatását! (v.ö.: Prolog DCG)
59 Állapotkezelés hibakezeléssel kombinálva 1 Imperatív elemek a ben HS3-59 Elképzelhető, hogy egyszerre szeretnénk állapotot körbeadogatni és hibát kezelni: type MbStateT s a = s -> Maybe (a,s) Ehhez a típushoz új kombinátorokra van szükség: thenmst :: MbStateT s a -> (a -> MbStateT s b) -> MbStateT s b st `thenmst` f = \s -> case st s of Nothing -> Nothing Just (v,s ) -> f v s returnmst :: a -> MbStateT s a returnmst v = \s -> Just (v,s) Használatuk: addrec :: Record -> MbStateT DB () delrec :: Record -> MbStateT DB () newdb :: StateT DB () newdb = addrec rec1 `thenmst` \_ -> addrec rec2 `thenmst` \_ -> delrec rec3
60 Állapotkezelés hibakezeléssel kombinálva 2 Imperatív elemek a ben HS3-60 A \_ -> kiírása eléggé feleslegesnek tűnik. Vezessünk be egy újabb kombinátort: then_mst :: MbStateT s a -> MbStateT s b -> MbStateT s b st1 `then_mst` st2 = st1 `thenmst` \_ -> st2 Ennek használatával newdb nagyon egyszerűvé és kifejezővé válik: newdb :: StateT DB () newdb = addrec rec1 `then_mst` addrec rec2 `then_mst` delrec rec3
61 Monádok 1 Imperatív elemek a ben HS3-61 Jó lenne ezeket a hasonló hatású kombinátorokat ugyanazzal a szintaktikával írni. Ötlet: típusosztály bevezetése. Előnyök: azonos szintaktika minden monádhoz írhatók generikus monadikus függvények bevezethetők szintaktikus édesítőszerek A Monad típusosztály class Monad m where return :: a -> m a (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> m b fail :: String -> m a -- Minimal complete definition: (>>=), return p >> q = p >>= \ _ -> q fail s = error s Itt >>= (kötés vagy bind) felel meg a then... kombinátornak, >> a then_... kombinátornak.
62 Monádok 2 Imperatív elemek a ben HS3-62 Törvények nem minden szemamtikai megkötés adható meg típusokkal ezeket ún. törvényekkel (laws) adjuk meg a törvények betartása a programozó felelőssége az Eq osztályban: x /= y not (x == y) a Functor osztályban: fmap id id fmap (f. g) fmap f. fmap g a Monad osztályban: return a >>= k k a m >>= return m xs >>= return. f fmap f xs m >>= (\x -> k x >>= h) (m >>= k) >>= h Párhuzam a félcsoportokkal >>= a félcsoport művelete return a félcsoport egységeleme
63 A Maybe monád Imperatív elemek a ben HS3-63 Része a Prelude-nak. Deklaráció instance Monad Maybe where Just x >>= k = k x Nothing >>= k = Nothing return = Just fail s = Nothing Használat doquery :: Query -> DB -> Maybe Record r :: Maybe Record r = doquery q1 db >>= \r1 -> doquery (q2 r1) db >>= \r2 -> doquery (q3 r2) db >>=...
64 Az ST monád (állapottranszformátorok) Imperatív elemek a ben HS3-64 Gond: monadikus típus létrehozásához típuskonstruktorra van szükség, StateT nem alkalmas. Ötlet: az állapottranszformátort be kell csomagolni egy adatkonstruktorba. Deklaráció newtype ST s a = ST (StateT s a) instance Monad (ST s) where ST st >>= f = ST (\s -> let (v,s ) = st s ST st = f v in st s ) return a = ST (\s -> (a,s)) Használat addrec :: Record -> ST DB Bool delrec :: Record -> ST DB Bool newdb :: ST DB Bool newdb = addrec rec1 >>= \ok1 -> addrec rec2 >>= \ok2 -> delrec rec3 >>= \ok3 -> return (ok1 && ok2 && ok3)
65 A do jelölés Imperatív elemek a ben HS3-65 A >>= és >> operátorok még kényelmesebb használatához van egy szintaktikus édesítőszer. Az előbbi newdb változata: newdb :: ST DB Bool newdb = do ok1 <- addrec rec1 ok2 <- addrec rec2 ok3 <- delrec rec3 return (ok1 && ok2 && ok3) Átalakítási szabályok: do minta <- kifejezés = kifejezés >>= (minta -> do parancsok) parancsok do kifejezés = kifejezés >> do parancsok parancsok do let deklarációk = let deklarációk parancsok in do parancsok do kifejezés = kifejezés
66 Imperatív stílusú programozás az ST monáddal 1 Imperatív elemek a ben HS3-66 Feladat: legnagyobb közös osztó kiszámítása. Egy imperatív pszeudonyelven: while x!= y do if x < y then y := y-x else x := x-y return x ben: type ImpS = (Integer,Integer) lekérdező transzformátorok: getx, gety :: ST ImpS Integer getx = ST (\(x,y) -> (x, (x,y))) gety = ST (\(x,y) -> (y, (x,y))) módosító transzformátorok: putx, puty :: Integer -> ST ImpS () putx x = ST (\(x,y) -> ((), (x,y))) puty y = ST (\(x,y) -> ((), (x,y )))
67 Imperatív stílusú programozás az ST monáddal 2 Imperatív elemek a ben HS3-67 A transzformátorok használata: gcdst :: ST ImpS Integer gcdst = do x <- getx y <- gety case compare x y of EQ -> return x LT -> do puty (y-x) gcdst GT -> do putx (x-y) gcdst Egy tanszformátor alkalmazása egy állapotra: applyst :: ST s a -> StateT s a applyst (ST st) = st Felhasználás: gcd x y = fst $ applyst gcdst (x,y) gcd 8 4 == 4 ; gcd 8 5 == 1 ; gcd 8 6 == 2
68 Monádok 3 Imperatív elemek a ben HS3-68 További tulajdonságok Absztrakt adatstruktúra definiálásával elérhetjük, hogy csak a Monad osztály kombinátoraival lehessen kezelni egy monád elemeit. A monádból nem lehet kilépni: ha egy függvényben valahol megjelenik és csak kombinátorokkal kezeljük akkor a függvény eredménye is monadikus lesz. A kombinátorok egyértelműen megadják a kiértékelés sorrendjét. További monadikus műveletek sequence :: Monad m => [m a] -> m [a] sequence [] = return [] sequence (c:cs) = do x <- c xs <- sequence cs return (x:xs) fst ((applyst. sequence) [gety,getx,gcdst] (8,6)) == [6,8,2] mapm :: Monad m => (a -> m b) -> [a] -> m [b] mapm f = sequence. map f
69 Monádok aritmetikája Imperatív elemek a ben HS3-69 A félcsoport kibővítése a félcsoport kiegészíthető egy nullelemmel (mzero) és egy második művelettel (mplus) törvények: mzero >>= k mzero p `mplus` mzero p mzero `mplus` p p p `mplus` (q `mplus` r) (p `mplus` q) `mplus` r a hibakezelő monádok esetében (pl. Maybe) az mzero elem hibajelzésre, az mplus kombinátor hibakezelésre szolgál (try `mplus` catch). A MonadPlus osztály class Monad m => MonadPlus m where mzero :: m a mplus :: m a -> m a -> m a instance MonadPlus Maybe where mzero = Nothing Nothing mplus ys = ys xs mplus ys = xs
70 A lista mint monád Imperatív elemek a ben HS3-70 instance Monad [ ] where (x:xs) >>= f = f x ++ (xs >>= f) [] >>= f = [] return x = [x] fail s = [] instance MonadPlus [ ] where mzero = [] mplus = (++) a listanézet tkp. egy édesítőszere a monadikus kombinátoroknak! [ (x,y) x <- [1,2,3], do x <- [1,2,3] y <- [1,2,3], y <- [1,2,3] x /= y ] True <- return (x /= y) return (x,y) Ha a mintaillesztés nem sikerül (pl. True), akkor az a sor egy fail s hívással ekvivalens, ahol s a hiba helyére utaló szöveg.
71 A Monad könyvtár Imperatív elemek a ben HS3-71 a MonadPlus osztály és két implementációja (Maybe, listák) további hasznos függvények: msum msum :: MonadPlus m => [m a] -> m a = foldr mplus mzero when :: (Monad m) => Bool -> m () -> m () when p s = if p then s else return () guard :: MonadPlus m => Bool -> m () guard p = if p then return () else mzero liftm :: (Monad m) => (a -> b) -> (m a -> m b) liftm f = \a -> do { a <- a; return (f a ) } liftm2 :: (Monad m) => (a -> b -> c) -> (m a -> m b -> m c) liftm2 f = \a b -> do { a <- a; b <- b; return (f a b ) } ap :: (Monad m) => m (a -> b) -> m a -> m b ap = liftm2 ($)
72 Ki- és bevitel 1 Imperatív elemek a ben HS3-72 Alapok tisztán funkcionális világ ugyanaz az kifejezés mindig ugyanazt az értéket adja ha I/O-t szeretnénk, kell egy argumentum, ami a világ állapotát képviseli: World az I/O függvények a World állapot transzformátorai monád használatával el lehet rejteni az állapot körbepasszolgatását data IO a = IO (StateT World a) az IO a típus absztrakt, nem lehet kibontani csak monadikusan lehet kezelni az IO a típusú értékeket akciónak nevezzük Akciók kezelése ha az interpreternek akciót kell kiértékelni, végrehajtja, azaz átadja neki a világ állapotát önálló program írásához definiálni kell a Main.main :: IO a (általában IO () típusú) függvényt az IO könyvtár tartalmazza a filekezeléshez szükséges függvényeket
73 Ki- és bevitel 2 Imperatív elemek a ben HS3-73 Egyszerű I/O függvények beolvasás: kiírás: getchar :: IO Char getcontents :: IO String getline :: IO String getline = do c <- getchar if c== \n then return "" else do cs <- getline; return (c:cs) putchar :: Char -> IO () putstr :: String -> IO () putstrln :: String -> IO () putstrln s = putstr s >> putchar \n kommunikáció: interact :: (String -> String) -> IO () interact f = getcontents >>= (putstr. f)
74 Ki- és bevitel 3 Imperatív elemek a ben HS3-74 Egy teljes példa: a wc Unix program import System (getargs) main :: IO () main = do args <- getargs case args of [fname] -> do fstr <- readfile fname let nwords = length. words $ fstr nlines = length. lines $ fstr nchars = length fstr putstrln. unwords $ [ show nlines, show nwords, show nchars, fname] _ -> putstrln "usage: wc fname"
75 Ki- és bevitel 4 Imperatív elemek a ben HS3-75 Hibakezelés az IO monádba hibakezelés is be van építve (ld. MBStateT) a hibák IOError típusúak hiba jelzése: felhasználói hiba: a kettő együtt: hibakezelés: ioerror :: IOError -> IO a usererror :: String -> IOError fail = ioerror. usererror catch :: IO a -> (IOError -> IO a) -> IO a getchar :: IO Char getchar = getchar `catch` (\e -> return \n ) szebben ugyanez: getchar :: IO Char getchar = getchar `catch` eofhandler where eofhandler e = if iseoferror e then return \n else ioerror e
76 A HASKELL PROGRAMOZÓ EVOLÚCIÓJA
77 Egyszerű megoldások A programozó evolúciója HS3-77 Az elsőéves: fac n = if n == 0 then 1 else n * fac (n-1) A kezdő: fac 0 = 1 fac n = n * fac (n-1) A haladó (jobb, ill. baloldali érzületű, és aki mást mutat, mint ami): fac n = foldr (*) 1 [1..n] fac n = foldl (*) 1 [1..n] fac n = foldr (\x g n -> g (x*n)) id [1..n] 1 A memoizer : facs = scanl (*) 1 [1..] fac n = facs!! n
78 Valamivel komplikáltabb megoldások A programozó evolúciója HS3-78 Az akkumuláló: facacc a 0 = a facacc a n = facacc (n*a) (n-1) fac = facacc 1 A fixpontos: y f = f (y f) fac = y (\f n -> if (n==0) then 1 else n * f (n-1)) A komibnátoros: s f g x = f x (g x) k x y = x b f g x = f (g x) c f g x = f x g y f = f (y f) cond p f g x = if p x then f x else g x fac = y (b (cond ((==) 0) (k 1)) (b (s (*)) (c b pred)))
79 A statikus A programozó evolúciója HS3-79 data Zero data Succ n class Add a b c a b -> c where add :: a -> b -> c instance Add Zero b b instance Add a b c => Add (Succ a) b (Succ c) class Mul a b c a b -> c where mul :: a -> b -> c instance Mul Zero b Zero instance (Mul a b c, Add b c d) => Mul (Succ a) b d class Fac a b a -> b where fac :: a -> b instance Fac Zero One instance (Fac n k, Mul (Succ n) k m) => Fac (Succ n) m
80 A Ph.D. fokozatot szerzett 1 A programozó evolúciója HS explicit type recursion based on functors newtype Mu f = Mu (f (Mu f)) deriving Show in x = Mu x out (Mu x) = x -- cata- and ana-morphisms for *arbitrary* (regular) base functors cata phi = phi. fmap (cata phi). out ana psi = in. fmap (ana psi). psi -- base functor and data type for natural numbers, -- using a curried elimination operator data N b = Zero Succ b deriving Show instance Functor N where fmap f = nelim Zero (Succ. f) nelim z s Zero = z nelim z s (Succ n) = s n type Nat = Mu N
81 A Ph.D. fokozatot szerzett 2 A programozó evolúciója HS conversion to internal numbers, conveniences and applications int = cata (nelim 0 (1+)) instance Show Nat where show = show. int zero = in Zero suck = in. Succ -- pardon my "French" (Prelude conflict) plus n = cata (nelim n suck ) mult n = cata (nelim zero (plus n)) -- base functor and data type for lists data L a b = Nil Cons a b deriving Show instance Functor (L a) where fmap f = lelim Nil (\a b -> Cons a (f b)) lelim n c Nil = n lelim n c (Cons a b) = c a b type List a = Mu (L a)
82 A Ph.D. fokozatot szerzett 3 A programozó evolúciója HS conversion to internal lists, conveniences and applications list = cata (lelim [] (:)) instance Show a => Show (List a) where show = show. list prod = cata (lelim (suck zero) mult) upto = ana (nelim Nil (diag (Cons. suck)). out) diag f x = f x x fac = prod. upto
83 A professzor A programozó evolúciója HS3-83 fac n = product [1..n]
HASKELL. Tartalom előadás
HASKELL Tartalom 1 HS1-2 1. előadás Bevezetés A mint funkcionális nyelv típusok és értékek függvények és operátorok adatkonstruktorok tulajdonságai mintaillesztés, őrök vezérlési szerkezetek a forráskód
FUNKCIONÁLIS PROGRAMOZÁS GYAKORLAT JEGYZET
FUNKCIONÁLIS PROGRAMOZÁS GYAKORLAT JEGYZET Szerkesztette: Balogh Tamás 2013. május 17. Ha hibát találsz, kérlek jelezd a info@baloghtamas.hu e-mail címen! Ez a Mű a Creative Commons Nevezd meg! - Ne add
Tulajdonságalapú tesztelés
Tulajdonságalapú tesztelés QuickCheck A QuickCheck Haskell programok automatikus, tulajdonságalapú tesztelésére használható. Programspecifikáció: program által teljesítendő tulajdonságok Nagy számú, a
2019, Funkcionális programozás. 2. el adás. MÁRTON Gyöngyvér
Funkcionális programozás 2. el adás Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2019, tavaszi félév Mir l volt szó? Követelmények, osztályozás Programozási
Funkcionális Nyelvek 2 (MSc)
Funkcionális Nyelvek 2 (MSc) Páli Gábor János pgj@elte.hu Eötvös Loránd Tudományegyetem Informatikai Kar Programozási Nyelvek és Fordítóprogramok Tanszék Tematika A (tervezett) tematika rövid összefoglalása
Programozás burritokkal
Monádok (folytatás) Programozás burritokkal [2..21] Programozás monádokkal: Programstrukturálás type IO α = World (α, World) -- putstr :: String IO () -- getline :: IO String (>>=) :: IO α (α IO β) IO
2016, Funkcionális programozás
Funkcionális programozás 2. előadás Sapientia Egyetem, Műszaki és Humántudományok Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2016, tavaszi félév Miről volt szó? Programozási paradigmák: imperatív,
2019, Funkcionális programozás. 5. el adás. MÁRTON Gyöngyvér
Funkcionális programozás 5. el adás Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2019, tavaszi félév Mir l volt szó? a Haskell kiértékelési stratégiája
2016, Funkcionális programozás
Funkcionális programozás 11. előadás Sapientia Egyetem, Műszaki és Humántudományok Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2016, tavaszi félév Miről volt szó? Haskell I/O műveletek, feladatok:
2018, Funkcionális programozás
Funkcionális programozás 6. előadás Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2018, tavaszi félév Miről volt szó? Haskell modulok, kompilálás a
Alapok. tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók
Haskell 1. Alapok tisztán funkcionális nyelv, minden függvény (a konstansok is) nincsenek hagyományos változók, az első értékadás után nem módosíthatók elég jól elkerülhetők így a mellékhatások könnyebben
FUNKCIONÁLIS PROGRAMOZÁS
FUNKCIONÁLIS PROGRAMOZÁS A funkcionális programozás néhány jellemzője Funkcionális programozás 1-2 Funkcionális, más néven applikatív programozás Funkcionális = függvényalapú, függvényközpontú Applikatív
Tisztán funkcionális adatszerkezetek
Tisztán funkcionális adatszerkezetek Bevezetés A hatékony adatszerkezetek általában... [..] language-independent only in the sense of Henry Ford: Programmers can use any language as they want, as long
2018, Funkcionális programozás
Funkcionális programozás 3. előadás Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2018, tavaszi félév Miről volt szó? A Haskell programozási nyelv főbb
FUNKCIONÁLIS PROGRAMOZÁS ELŐADÁS JEGYZET
FUNKCIONÁLIS PROGRAMOZÁS ELŐADÁS JEGYZET Szerkesztette: Balogh Tamás 2013. május 30. Ha hibát találsz, kérlek jelezd a info@baloghtamas.hu e-mail címen! Ez a Mű a Creative Commons Nevezd meg! - Ne add
2018, Funkcionális programozás
Funkcionális programozás 10. előadás Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2018, tavaszi félév Miről volt szó? a foldl és foldr függvények lista
2018, Funkcionális programozás
Funkcionális programozás 1. előadás Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2018, tavaszi félév Követelmények, osztályozás Előadás, jelenlét:
Tisztán funkcionális adatszerkezetek (folytatás)
Tisztán funkcionális adatszerkezetek (folytatás) FingerTree (intuíció) [2..26] FingerTree (intuíció) [3..26] FingerTree (intuíció) [4..26] FingerTree (intuíció) [5..26] FingerTree (intuíció) [6..26] FingerTree
Funkcionális és logikai programozás. { Márton Gyöngyvér, 2012} { Sapientia, Erdélyi Magyar Tudományegyetem }
Funkcionális és logikai programozás { Márton Gyöngyvér, 2012} { Sapientia, Erdélyi Magyar Tudományegyetem } http://www.ms.sapientia.ro/~mgyongyi ` 1 Jelenlét: Követelmények, osztályozás Az első 4 előadáson
Funkcionális programozás
Funkcionális programozás Horváth Zoltán E-mail: hz@inf.elte.hu Eötvös Lóránd Tudományegyetem, Budapest Programozási Nyelvek és Fordítóprogramok Tanszék Ajánlott irodalom Plasmeijer et al.: Programming
2018, Funkcionális programozás
Funkcionális programozás 7. előadás Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2018, tavaszi félév Miről volt szó? összefésüléses rendezés (merge
Kifejezések. Kozsik Tamás. December 11, 2016
Kifejezések Kozsik Tamás December 11, 2016 Kifejezések Lexika Szintaktika Szemantika Lexika azonosítók (változó-, metódus-, típus- és csomagnevek) literálok operátorok, pl. + zárójelek: (), [], {},
A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok
A szemantikus elemzés helye Forrásprogram Forrás-kezelő (source handler) Lexikális elemző (scanner) A szemantikus elemzés feladatai Fordítóprogramok előadás (A, C, T szakirány) Szintaktikus elemző (parser)
Kifejezések. Kozsik Tamás. December 11, 2016
Kifejezések Kozsik Tamás December 11, 2016 Kifejezés versus utasítás C/C++: kifejezés plusz pontosvessző: utasítás kiértékeli a kifejezést jellemzően: mellékhatása is van például: értékadás Ada: n = 5;
S2-01 Funkcionális nyelvek alapfogalmai
S2-01 Funkcionális nyelvek alapfogalmai Tartalom 1. Funkcionális nyelvek alapfogalmai Modell Kiértékelés Curry-zés Magasabbrendű függvények Listák Tisztaság 2. Típusok Algebrai adattípusok Típusosztályok
Java II. I A Java programozási nyelv alapelemei
Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2008. 02. 19. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve az annak
Operációs Rendszerek II. labor. 2. alkalom
Operációs Rendszerek II. labor 2. alkalom Mai témák (e)grep Shell programozás (részletesebben, példákon keresztül) grep Alapvető működés: mintákat keres a bemeneti csatorna (STDIN vagy fájl) soraiban,
Programozás I. 3. gyakorlat. Szegedi Tudományegyetem Természettudományi és Informatikai Kar
Programozás I. 3. gyakorlat Szegedi Tudományegyetem Természettudományi és Informatikai Kar Antal Gábor 1 Primitív típusok Típus neve Érték Alap érték Foglalt tár Intervallum byte Előjeles egész 0 8 bit
Programozás II. 2. Dr. Iványi Péter
Programozás II. 2. Dr. Iványi Péter 1 C++ Bjarne Stroustrup, Bell Laboratórium Első implementáció, 1983 Kezdetben csak precompiler volt C++ konstrukciót C-re fordította A kiterjesztés alapján ismerte fel:.cpp.cc.c
és az instanceof operátor
Java VIII. Az interfacei és az instanceof operátor Krizsán Zoltán Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2005. 10. 24. Java VIII.: Interface JAVA8 / 1 Az interfészről általában
Szkriptnyelvek. 1. UNIX shell
Szkriptnyelvek 1. UNIX shell Szkriptek futtatása Parancsértelmez ő shell script neve paraméterek shell script neve paraméterek Ebben az esetben a szkript tartalmazza a parancsértelmezőt: #!/bin/bash Szkriptek
Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán
Java VIII. Az interfacei és az instanceof operátor Krizsán Zoltán Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2005. 10. 24. Java VIII.: Interface JAVA8 / 1 Az interfészről általában
Algoritmizálás és adatmodellezés tanítása 1. előadás
Algoritmizálás és adatmodellezés tanítása 1. előadás Algoritmus-leíró eszközök Folyamatábra Irányított gráf, amely csomópontokból és őket összekötő élekből áll, egyetlen induló és befejező éle van, az
Informatika terméktervezőknek
Informatika terméktervezőknek C# alapok Névterület (namespace) using Osztály (class) és Obejtumok Metódus (function, procedure, method) main() static void string[] arg Szintaxis // /* */ \n \t Névadások
Tisztán funkcionális adatszerkezetek (folytatás)
Tisztán funkcionális adatszerkezetek (folytatás) Rövid összefoglalás az eddigiekről A hatékony adatszerkezetek általában... [..] language-independent only in the sense of Henry Ford: Programmers can use
Python tanfolyam Python bevezető I. rész
Python tanfolyam Python bevezető I. rész Mai tematika Amiről szó lesz (most): Interpretált vs. fordított nyelvek, GC Szintakszis Alaptípusok Control flow: szekvencia, szelekció, iteráció... Függvények
Programozás BMEKOKAA146. Dr. Bécsi Tamás 2. előadás
Programozás BMEKOKAA146 Dr. Bécsi Tamás 2. előadás Szintaktikai alapok Alapvető típusok, ismétlés C# típus.net típus Méret (byte) Leírás byte System.Byte 1Előjel nélküli 8 bites egész szám (0..255) char
2019, Funkcionális programozás. 4. el adás. MÁRTON Gyöngyvér
Funkcionális programozás 4. el adás Sapientia Egyetem, Matematika-Informatika Tanszék Marosvásárhely, Románia mgyongyi@ms.sapientia.ro 2019, tavaszi félév Mir l volt szó? GHC parancsok fenntartott szavak
Oktatási segédlet 2014
Oktatási segédlet 2014 A kutatás a TÁMOP 4.2.4.A/2-11-1-2012- 0001 azonosító számú Nemzeti Kiválóság Program Hazai hallgatói, illetve kutatói személyi támogatást biztosító rendszer kidolgozása és működtetése
Java II. I A Java programozási nyelv alapelemei
Java2 / 1 Java II. I A Java programozási nyelv alapelemei Miskolci Egyetem Általános Informatikai Tanszék Utolsó módosítás: 2009. 02. 09. Java II.: Alapelemek JAVA2 / 1 A Java formalizmusa A C, illetve
A C# programozási nyelv alapjai
A C# programozási nyelv alapjai Tisztán objektum-orientált Kis- és nagybetűket megkülönbözteti Ötvözi a C++, Delphi, Java programozási nyelvek pozitívumait.net futtatókörnyezet Visual Studio fejlesztőkörnyezet
BASH script programozás II. Vezérlési szerkezetek
06 BASH script programozás II. Vezérlési szerkezetek Emlékeztető Jelölésbeli különbség van parancs végrehajtása és a parancs kimenetére való hivatkozás között PARANCS $(PARANCS) Jelölésbeli különbség van
Lineáris belsőpontos Newton-iteráció
Lineáris belsőpontos Newton-iteráció Implementáció Haskellben Dr. Érdi Gergő http://gergo.erdi.hu/ Az alábbiakban összeállítunk egy Haskell modult, amely a belsőpontos Newton-iteráció algoritmusával old
Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606. Dr. Bécsi Tamás 2. előadás
Számítástechnika I. BMEKOKAA152 BMEKOKAA119 Infokommunikáció I. BMEKOKAA606 Dr. Bécsi Tamás 2. előadás Console I/O bővebben Lásd mintaprogram 2015.09.21. Számítástechnika I. 2. Előadás 2 Számábrázolásról
Funkcioná lis prográmozá s Start
Start Ez a jegyzet a tudásom és a http://pnyf.inf.elte.hu/fp/index.xml szerint készült, előfordulhatnak benne hibák, de igyekszem megértetni. Elsőnek érdemes elolvasni, kis leírás a Haskell programnyelvről:
Programozás II. 2. gyakorlat Áttérés C-ről C++-ra
Programozás II. 2. gyakorlat Áttérés C-ről C++-ra Tartalom Új kommentelési lehetőség Változók deklarációjának helye Alapértelmezett függvényparaméterek Névterek I/O műveletek egyszerűsödése Logikai adattípus,
Szoftvertervezés és -fejlesztés I.
Szoftvertervezés és -fejlesztés I. Operátorok Vezérlési szerkezetek Gyakorlás 1 Hallgatói Tájékoztató A jelen bemutatóban található adatok, tudnivalók és információk a számonkérendő anyag vázlatát képezik.
Felhasználó által definiált adattípus
Felhasználó által definiált adattípus C++ Izsó Tamás 2017. február 24. Izsó Tamás Felhasználó által definiált adattípus/ 1 Irodalom Izsó Tamás Felhasználó által definiált adattípus/ 2 Programtervezési
Programozási nyelvek Java
Programozási nyelvek Java Kozsik Tamás előadása alapján Készítette: Nagy Krisztián 9. előadás Interface - típust vezet be, de osztálypéldány nem készíthető belőle (statikus típust ad) - több osztály is
PYTHON. Avagy hosszú az út a BioPythonig
PYTHON Avagy hosszú az út a BioPythonig Miért a Python? Mert ez áll a legközelebb az ember által beszélt nyelvhez. Mert ez a leggyorsabb az ismert script nyelvek közül Mert rengeteg modul érhető el hozzá
Már megismert fogalmak áttekintése
Interfészek szenasi.sandor@nik.bmf.hu PPT 2007/2008 tavasz http://nik.bmf.hu/ppt 1 Témakörök Polimorfizmus áttekintése Interfészek Interfészek kiterjesztése Eseménykezelési módszerek 2 Már megismert fogalmak
Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok
Bevezetés a programozásba II 5. Előadás: Másoló konstruktor, túlterhelés, operátorok Emlékeztető struct Vektor { int meret, *mut; Vektor(int meret); int szamlal(int mit); }; int Vektor::szamlal(int mit)
A Feldspar fordító, illetve Feldspar programok tesztelése
A Feldspar fordító, illetve Feldspar programok tesztelése [KMOP-1.1.2-08/1-2008-0002 társfinanszírozó: ERFA] Leskó Dániel Eötvös Loránd Tudományegyetem Programozási Nyelvek és Fordítóprogramok Tanszék
Pénzügyi algoritmusok
Pénzügyi algoritmusok A C++ programozás alapjai Tömbök (3. rész) Konstansok Kivételkezelés Tömbök 3. Többdimenziós tömbök Többdimenziós tömbök int a; Többdimenziós tömbök int a[5]; Többdimenziós tömbök
Programozás alapjai. 5. előadás
5. előadás Wagner György Általános Informatikai Tanszék Cserélve kiválasztásos rendezés (1) A minimum-maximum keresés elvére épül. Ismétlés: minimum keresés A halmazból egy tetszőleges elemet kinevezünk
1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon
1. Template (sablon) 1.1. Függvénysablon Maximum függvény megvalósítása függvénynév túlterheléssel. i n l i n e f l o a t Max ( f l o a t a, f l o a t b ) { return a>b? a : b ; i n l i n e double Max (
Doktori értekezés. Diviánszky Péter 2012.
Doktori értekezés Diviánszky Péter 2012. Referenciák tisztán funkcionális nyelvekben Diviánszky Péter ELTE IK Informatika Doktori Iskola Az informatika alapjai és módszertana oktatási program vezető:
AWK programozás, minták, vezérlési szerkezetek
10 AWK programozás, minták, vezérlési szerkezetek AWK adatvezérelt szkriptnyelv text processing, adat kiterjesztés, tagolt adatok automatizált soronkénti feldolgozása a forrásállományt soronként beolvassa
Mechatronika és mikroszámítógépek 2017/2018 I. félév. Bevezetés a C nyelvbe
Mechatronika és mikroszámítógépek 2017/2018 I. félév Bevezetés a C nyelvbe A C programozási nyelv A C egy általános célú programozási nyelv, melyet Dennis Ritchie fejlesztett ki Ken Thompson segítségével
Programok értelmezése
Programok értelmezése Kód visszafejtés. Izsó Tamás 2016. szeptember 22. Izsó Tamás Programok értelmezése/ 1 Section 1 Programok értelmezése Izsó Tamás Programok értelmezése/ 2 programok szemantika értelmezése
OOP #14 (referencia-elv)
OOP #14 (referencia-elv) v1.0 2003.03.19. 21:22:00 Eszterházy Károly Főiskola Információtechnológia tsz. Hernyák Zoltán adj. e-mail: aroan@ektf.hu web: http://aries.ektf.hu/~aroan OOP OOP_14-1 - E jegyzet
Algoritmizálás + kódolás C++ nyelven és Pascalban
Algoritmizálás + kódolás nyelven és ban Motiváció A Programozási alapismeretek tárgyban az algoritmizáláshoz struktogramot, a kódoláshoz nyelvet használunk, a Közismereti informatikában (a közoktatásban
Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges. Könyvtárhierarhiát fed: Pl.: java/util/scanner.java
Függvények, csomagok Csomagok Az osztályok csomagokba vannak rendezve, minden csomag tetszőleges számú osztályt tartalmazhat Pl.: java.util.scanner Könyvtárhierarhiát fed: Pl.: java/util/scanner.java Célja:
1. Egyszerű (primitív) típusok. 2. Referencia típusok
II. A Java nyelv eszközei 1. Milyen eszközöket nyújt a Java a programozóknak Korábban már említettük, hogy a Java a C nyelvből alakult ki, ezért a C, C++ nyelvben járatos programozóknak nem fog nehézséget
2. Rekurzió. = 2P2(n,n) 2 < 2P2(n,n) 1
2. Rekurzió Egy objektum definícióját rekurzívnak nevezünk, ha a definíció tartalmazza a definiálandó objektumot. Egy P eljárást (vagy függvényt) rekurzívnak nevezünk, ha P utasításrészében előfordul magának
A C programozási nyelv I. Bevezetés
A C programozási nyelv I. Bevezetés Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv I. (bevezetés) CBEV1 / 1 A C nyelv története Dennis M. Ritchie AT&T Lab., 1972 rendszerprogramozás,
A C programozási nyelv I. Bevezetés
A C programozási nyelv I. Bevezetés Miskolci Egyetem Általános Informatikai Tanszék A C programozási nyelv I. (bevezetés) CBEV1 / 1 A C nyelv története Dennis M. Ritchie AT&T Lab., 1972 rendszerprogramozás,
AWK programozás, minták, vezérlési szerkezetek
10 AWK programozás, minták, vezérlési szerkezetek AWK futtatási módok AWK parancs, közvetlen programkódmegadás: awk 'PROGRAMKÓD' FILE példa: ls -l awk '{print $1, $5}' a programkód helyére minden indentálás
Programozási nyelvek (ADA)
Programozási nyelvek (ADA) Kozsik Tamás előadása alapján Készítette: Nagy Krisztián 1. előadás Hasznos weboldal http://kto.web.elte.hu Program felépítése Programegységek (program unit) eljárások (procedure)
ABSZTRAKCIÓ FÜGGVÉNYEKKEL (ELJÁRÁSOKKAL)
ABSZTRAKCIÓ FÜGGVÉNYEKKEL (ELJÁRÁSOKKAL) Elágazó rekurzió Absztrakció függvényekkel (eljárásokkal) FP-5..7-2 Korábban lineáris-rekurzív, ill. lineáris-iteratív folyamatokra láttunk példákat (faktoriális
Szoftvertechnológia alapjai Java előadások
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz e-mail: fandrew@mit.bme.hu tárgy honlap: http://home.mit.bme.hu/~fandrew/szofttech_hu.html A mai előadás tartalma: Miért pont Java?
Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés
Bevezetés a programozásba 2 7. Előadás: Objektumszű és osztályszű elemek, hibakezelés ISMÉTLÉS Osztály class Particle { public: Particle( X, X, Y); virtual void mozog( ); ); virtual void rajzol( ) const;
Globális operátor overloading
Programozás II. 9. gyakorlat Operátor overloading 2: Unáris operátorok, globálisan megvalósított operátorok, > operátorok Kivételkezelés, IO library Globális operátor overloading Előző alkalommal
Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)
Programozás alapjai C nyelv 4. gyakorlat Szeberényi Imre BME IIT Mit tudunk már? Típus fogalma char, int, float, double változók deklarációja operátorok (aritmetikai, relációs, logikai,
C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem
C# nyelv alapjai Krizsán Zoltán 1 Általános Informatikai Tanszék Miskolci Egyetem Objektumorientált programozás C# alapokon tananyag Tartalom Bevezetés Lokális változó Utasítások Szójáték Why do all real
OOP. Alapelvek Elek Tibor
OOP Alapelvek Elek Tibor OOP szemlélet Az OOP szemlélete szerint: a valóságot objektumok halmazaként tekintjük. Ezen objektumok egymással kapcsolatban vannak és együttműködnek. Program készítés: Absztrakciós
Programozás C és C++ -ban
Programozás C és C++ -ban 2. További különbségek a C és C++ között 2.1 Igaz és hamis A C++ programozási nyelv a C-hez hasonlóan definiál néhány alap adattípust: char int float double Ugyanakkor egy új
Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double
Programozás alapjai C nyelv 4. gyakorlat Szeberényi Imre BME IIT Programozás alapjai I. (C nyelv, gyakorlat) BME-IIT Sz.I. 2005.10.10.. -1- Mit tudunk már? Típus fogalma char, int, float,
Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?
A "java Villa -v" parancs jelentése: A java interpreter elindítja a Villa osztály statikus main metódusát, és átadja neki paraméterként a "-v" stringet. A java interpreter elindítja először a Villa osztály
Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r
Programozás (GKxB_INTM021) Széchenyi István Egyetem, Gy r 2018. március 3. Függvények Mi az a függvény (function)? Programkód egy konkrét, azonosítható, paraméterezhet, újrahasznosítható blokkja Miért
1. Alapok. Programozás II
1. Alapok Programozás II Elérhetőség Név: Smidla József Elérhetőség: smidla dcs.uni-pannon.hu Szoba: I916 2 Irodalom Bjarne Stroustrup: A C++ programozási nyelv 3 Irodalom Erich Gamma, Richard Helm, Ralph
Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás
Számítástechnika II. BMEKOKAA153 1. Előadás Dr. Bécsi Tamás Bemutatkozás Előadó: Dr. Bécsi Tamás St.106, (1)463-1044, becsi.tamas@mail.bme.hu Közlekedés-, és Járműirányítási Tanszék www.kjit.bme.hu A tantárgyi
C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18
C# Nyelvi Elemei Tóth Zsolt Miskolci Egyetem 2013 Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei 2013 1 / 18 Tartalomjegyzék 1 Object 2 Típusok 3 String 4 RegEx Tóth Zsolt (Miskolci Egyetem) C# Nyelvi
Imperatív és procedurális programozás a Javában
Imperatív és procedurális programozás a Javában Kozsik Tamás kto@elte.hu http://kto.web.elte.hu/ Eötvös Loránd Tudományegyetem Programozási Nyelvek és Fordítóprogramok Tanszék 2008. Kozsik Tamás (ELTE)
Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós február 18. Széchenyi István Egyetem, Gy r
Programozás (GKxB_INTM021) Széchenyi István Egyetem, Gy r 2018. február 18. Minimum és maximumkeresés u s i n g n a m e s p a c e s t d ; i n t main ( ) { c o u t
Java programozási nyelv
Java programozási nyelv 2. rész Vezérlő szerkezetek Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2005. szeptember A Java programozási nyelv Soós Sándor 1/23 Tartalomjegyzék
Abstract osztályok és interface-ek. 7-dik gyakorlat
Abstract osztályok és interface-ek 7-dik gyakorlat Abstract metódusok és osztályok Az OO fejlesztés során olyan osztályokat is kialakíthatunk, melyeket csak továbbfejlesztésre, származtatásra lehet használni,
Programozási nyelvek JAVA EA+GY 1. gyakolat
Programozási nyelvek JAVA EA+GY 1. gyakolat EÖTVÖS LORÁND TUDOMÁNYEGYTEM INFORMATIKAI KAR PROGRAMOZÁSI NYELVEK ÉS FORDÍTÓPROGRAMOK TANSZÉK 2018/2019. tavaszi félév Tartalom 1 A Java alapjai 2 Java program
Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat
Kivételkezelés, beágyazott osztályok Nyolcadik gyakorlat Kivételkezelés Nem minden hibát lehet fordítási időben megtalálni Korábban (pl. C-ben) a hibakezelést úgy oldották meg, hogy a függvény hibakódot
Imperatív programozás
Imperatív programozás 2. Előadás Python alapok Elérhetőség Tejfel Máté Déli épület, 2.616 matej@elte.hu http://matej.web.elte.hu Python Script nyelv Értelmezett (interpretált) Dinamikus típusrendszer Gyors
Occam 1. Készítette: Szabó Éva
Occam 1. Készítette: Szabó Éva Párhuzamos programozás Egyes folyamatok (processzek) párhuzamosan futnak. Több processzor -> tényleges párhuzamosság Egy processzor -> Időosztásos szimuláció Folyamatok közötti
Objektumorientált programozás Pál László. Sapientia EMTE, Csíkszereda, 2014/2015
Objektumorientált programozás Pál László Sapientia EMTE, Csíkszereda, 2014/2015 9. ELİADÁS Kivételkezelés (Exception handling) 2 Mi a kivétel (exception)? A kivétel, olyan hibás állapot vagy esemény, amely
S z á m í t ó g é p e s a l a p i s m e r e t e k
S z á m í t ó g é p e s a l a p i s m e r e t e k 7. előadás Ami eddig volt Számítógépek architektúrája Alapvető alkotóelemek Hardver elemek Szoftver Gépi kódtól az operációs rendszerig Unix alapok Ami
Objektumorientált programozás C# nyelven
Objektumorientált programozás C# nyelven 2. rész Öröklés és többalakúság Nemvirtuális metódusok, elrejtés Virtuális metódusok, elrejtés Típuskényszerítés, az is és as operátorok Absztrakt osztályok, absztrakt
Adatszerkezetek és algoritmusok
2009. november 13. Ismétlés El z órai anyagok áttekintése Ismétlés Specikáció Típusok, kifejezések, m veletek, adatok ábrázolása, típusabsztakció Vezérlési szerkezetek Függvények, paraméterátadás, rekurziók
Programozási nyelvek Java
Programozási nyelvek Java 11.gyakorlat Operációsrendszertől függő tulajdonságok PATH elválasztó Unix ":" Windows ";" final String PATH_SEPARATOR = File.pathSeparator; Ugyanaz, csak karakterkent final char
Absztrakt adattípus - algebrai specifikáció - Lists (paraméteres) module imports end exports parameters variables sorts operations equations
Absztrakt adattípus -algebrai specifikáció -Lists (paraméteres) module Lists imports Booleans, Naturals parameters Items sorts Item operations erroritem : Item eq? : Item, Item Boolean variables a, b,
Vezérlési szerkezetek
Vezérlési szerkezetek Szelekciós ok: if, else, switch If Segítségével valamely ok végrehajtását valamely feltétel teljesülése esetén végezzük el. Az if segítségével valamely tevékenység () végrehajtását
Interfészek. PPT 2007/2008 tavasz.
Interfészek szenasi.sandor@nik.bmf.hu PPT 2007/2008 tavasz http://nik.bmf.hu/ppt 1 Témakörök Polimorfizmus áttekintése Interfészek Interfészek kiterjesztése 2 Már megismert fogalmak áttekintése Objektumorientált
Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;
Java osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés. ( Előfeltétel 12. Tétel ) Az osztály egy olyan típus leíró struktúra, amely