Programování v Haskellu KSI MFF CUNI CZ 2019
|
|
- Michaela Křížová
- před 5 lety
- Počet zobrazení:
Transkript
1 Programování v Haskellu KSI MFF CUNI CZ
2 Úvod a předběžnosti
3 Meta, požadavky NPRG068, 2/0 Zk, 3 kredity kratochvil@ksi.mff.cuni.cz 2
4 Požadavky 1. Domácí úkoly využití prostředků jazyka rozsah cca. 5% LOC úkolů z Javy a C++ Zadání budou na webu Předběžný rozvrh: Úkol Zadání Termín (Týdny) Zkouška max 5 10 minut lehce teoretické diskuze zhodnocení odevzdaných úkolů témata budou vyvěšená na webu témata obsah slajdů obtížnost: po zvládnutí DÚ zanedbatelná, myšleno spíš jako kontrola a doplnění 3
5 Co je potřeba do kdy stihnout? Odevzdat úkoly v termínu. Termín je do půlnoci dne označeného jako termín (tj. první úkol byste měli začít odevzdávat nejpozději ve 23:59:59). Pokud nebudete stíhat, dejte vědět předem. Jít na zkoušku. Termíny a předtermíny budou v SISu. 4
6 DÚ požadavky Velikost řešení netřeba přehánět (čím menší, tím lepší!) Správnost: Rozumné použití typového systému pro prevenci běhových chyb Program v rozumném čase zvládne splnit několik jednoduchých testů (budou součástí zadání) Rozhraní dokumentujte command-line aplikace zvládnou --help (použijte např. optparse-applicative) a mají nějaká demonstrační data knihovny mají jednoduché testy (použijte HUnit nebo QuickCheck, co testovat bude popsáno v zadání) funkční Haddock se hodí 5
7 DÚ odevzdávání 1. Z řešení vyrobte cabalový balík 2. Použijte cabal sdist 3. výsledek nahrajte do odpovídající kolonky SISu. 6
8 Obsah přednášky 1. opakování z neprocedurálního programování 2. šťourání v typech, monádách a IO 3. standardní knihovna 4. implementace jazyka, RTS, typového systému a modularizace 5. nejužitečnější ostatní abstrakce a knihovny 7
9 Slajdy Slajdy jsou volně k dispozici na webu. Pokud najdete chybu nebo vymyslíte zlepšení: řekněte si o git access (implementace: lhs2tex + beamer) malé věci reportujte mailem Typické zlepšení: ilustrativní obrázek obsahující kočku. 8
10 Proč sem chodit? návrhové vzory z funkcionálního programování a Haskellu jsou jedny z nejmladších a nejužitečnějších věcí, které komunita má haskellové programy nepadají (tj.: haskellové programy nepadají z hloupých důvodů) funkcionální programování je Opravdu Hodně Expresivní důsledek: průmysl začíná chtít funkcionální programátory (ještě se musí zjistit, že Scala je fakt úlet) zjistíte i něco o ostatních jazycích 9
11 Proč sem chodit? Bonus 1: Haskellová praxe dramaticky zlepšuje schopnost programovat bez chyb ve všech ostatních jazycích. Programátor umí z libovolného typecheckeru vyždímat maximum. Bonus 2: Hodně temných a těžko vysvětlitelných jevů z C++ má v Haskellu svou pochopitelnější variantu. 10
12 Stručná historie 10
13 Industry-ready 10
14 10
15 Expresivní! wordcount = length words $ readline rle = map (lifta2 (, ) head length) group scc g = dfs g reverse postord $ transposeg g 11
16 11
17 12
18 Literatura Learn You A Haskell For Great Good Real World Haskell Hoogle Typeclassopædia Haskell Wikibook. 13
19 Okolní předměty NPRG005 Neproc typový systém Haskellu je skoro Prolog! hlavním účelem NPRG005 je naučit se rekurzi, tady budeme trochu blíž normálnímu programování NAIL078, NAIL079 Lambda kalkulus a funkcionální programování (ne)rozhodnutelnost, typové systémy, souvislost s logikou NAIL097 Funkcionální programování sémantika, typové systémy víc zblízka občas Agda a kategorie 14
20 Okolní jazyky Haskell je managed o napojení na systém se stará run-time. Nelze s ním (úplně) nahradit nízkoúrovňové jazyky (C, C++, Rust). Je velmi vhodné naplno využít potenciál run-time vrstvy a Haskellem nahrazovat různé polovičaté C-like managed jazyky typicky Javu a C#, běžně se stonásobnou úsporou kódu, času, chyb, rychlosti a nervů. Haskell je typovaný a kompilovaný nelze s ním (úplně) nahradit shell-like jazyky (Bash, R, K,... ), ale jde se k tomu dost přiblížit. Haskell není browserový, ale jde (s trochou opatrnosti) kompilovat do JavaScriptu. 15
21 Aktuální obsah slajdů 1. Úvod a předběžnosti 2. Rychloúvod do funkcionálního programování 16
22 Rychloúvod do funkcionálního programování
23 Kde sehnat prostředí Windows/Mac: Nainstalujte si Haskell Platform. Unix-compatible: Použijte oblíbený balíčkovač. apt-get install ghc yum install ghc pkg install ghc... ArchLinux: ještě navíc ghc-static! Distro-agnostic: ghcup Ve vlastním zájmu používejte nějaký unix. 17
24 Hello $ cat > hello.hs <<EOHS main = putstrln "Hello MFF!" EOHS $ runhaskell hello.hs Hello MFF! $ ghc hello.hs -o hello [1 of 1] Compiling Main ( hello.hs, hello.o ) Linking hello... $./hello Hello MFF! 18
25 Interpreter $ ghci hello.hs GHCi, version [1 of 1] Compiling Main ( hello.hs, interpreted ) Ok, one module loaded. *Main> :t main main :: IO () *Main> main Hello MFF! *Main>
26 Integrace s nástroji Standardní pomůcky: hindent, hlint. Editory: vim: Hashell-vim-now, Syntastic, neco-ghc emacs: spacemacs + haskell-mode, stack+intero obecně: ghc-mod IDE škodí kvalitě kódu. Pokud váš kód nebude číst nikdo jiný a bez IDE neumíte žít, můžete zkusit: leksah pluginy do IntelliJ, Eclipse, KDevelop 20
27 Syntax Haskell je deklarativní jazyk, program je hromada definovaných hodnot: jmenohodnoty = definicehodnoty hodnotasparametrem parametr = definice Pokud je v programu hodnota main, runtime ji pro spuštění programu vyhodnotí. main = print (1 + 1) 21
28 Syntax výrazů Jména proměnných začínají malým písmenem: a b ahoj Literály: 123, 1.5, a, "nazdar" 2 výrazy za sebou = aplikace funkce na parametr: negate 5 take 3 "kocka" operátory mají nižší prioritu než aplikace! +, -,++, ==, >=, <=,... negate 5 10? kulaté závorky: take "kocka" take (1 + 2) "kocka" 22
29 Operátory Vlastní operátory jde definovat s asociativitou a prioritou: infixr 3 + infixl 6 /%/ infix 5 :=> Operátor jde předělat na funkci uzávorkováním: (+) Identifikátor ve zpětných apostrofech je operátor: mod mod 3 1 Pozor na unární mínus. 23
30 Syntax funkcí Funkci jde definovat jako definici s parametrem: f a b c = b 2 4 a c nebo ekvivalentně jako lambdu: f = λa b c b 2 4 a c nebo ekvivalentně úplně rozdrobit: f = λa λb λc b 2 4 a c pojmenovávat lambdy není nutné λ se píše jako zpětné lomítko 24
31 Lokální definice Občas se hodí mít něco zadefinovaného lokálně. solve a b c = let d = b 2 4 a c solution op = ( b op sqrt d) / (2 a) in (solution (+), solution ( )) To samé obráceně: solve a b c = (solution (+), solution ( )) where d = b 2 4 a c solution op = ( b op sqrt d) / (2 a) 25
32 Řízení výpočtu if cond then a else b cond musí být booleovská hodnota if bez else nedává matematicky smysl (jaký typ má nic?) case x of moznost1 vysledek1 moznost2 vysledek2 necojineho 26
33 Řízení výpočtu 2 Pattern matching: Guards: fac 0 = 1 fac n = n fac (n 1) gcd x y x < y = gcd y x x y = x x > y = gcd y (x mod y) otherwise = -- error 27
34 Kritické vlastnosti jazyka Haskell je líný! Prakticky žádnou funkci nevyhodnotí, dokud to nebude přímo potřeba. Důsledek: nekonečná data jsou OK allintsfrom n = n : allintsfrom (n + 1) Haskell je staticky typovaný! Důsledky: při běhu nevznikne chyba z typových důvodů znalost typů lze při překladu různě využívat 28
35 Cykly jsou ve funkcionálním jazyce zbytečné. 28
36 Cykly jsou ve funkcionálním jazyce zbytečné. (jdou plně nahradit rekurzí) 28
37 Typy Názvy jednoduchých typů začínají velkým písmenem, typy je možné specifikovat pomocí čtyřtečky. cislo :: Integer cislo = 5 jinecislo = (5 :: Float) V ghci je možné typ čehokoliv zjistit pomocí :t. 29
38 Typy funkcí id :: a a...ve skutečnosti: id :: ( a) a a tj. neplatí id :: Int a ani id :: a Int. (, ) :: a b (a, b) ( ) :: (b c) (a b) (a c) head :: [a] a (+) :: Num a a a a...tzn. (+) :: ( a Num) a a a Monomorfní: id :: Int Int gcd :: Integer Integer Integer 30
39 Curry-style parametry Víceparametrové funkce neexistují! f :: Int Int Int Int f :: Int f :: Int (Int (Int Int)) f 1 :: Int (Int Int) (f 1) 2 :: Int Int ((f 1) 2) 3 :: Int Související kombinátory: curry :: ((a, b) c) (a b c) uncurry :: (a b c) ((a, b) c) 31
40 Haskell Curry 31
41 Curry-style parametry Koncept porodil Schönfinkel (1924), v kombinátorové logice populárně použil až Curry. Samozřejmě k dispozici je i varianta schön, unschön. 32
42 Moses Schönfinkel Arity pls. 32
43 Kontrolní otázka: Kolik parametrů má funkce id :: a a? 33
44 Kontrolní otázka: Kolik parametrů má funkce id :: a a? Odpověď: počty parametrů jsou blbost! id 5 id gcd id id gcd
45 Některé jednoduché typy 1 :: Int, Integer, Word, Int64,... c :: Char, Word8, :: Float, Double True :: Bool, False :: Bool () existující nicneříkající typ Void neexistující nicneříkající typ 34
46 Některé parametrizované typy [a] seznam [1, 2, 3] :: Num a [a] type String = [Char] Maybe a [Just c, Nothing] :: [Maybe Char] 35
47 Definice algebraických datových typů data Bool = False True data () = () data Void Typy s obsahem: data DvojiceIntu = Par Int Int Konstrukce: Par 2 3 :: DvojiceIntu Destrukce (a.k.a. pattern match): f :: DvojiceIntu Int f (Par a b) = b 36
48 Parametrické typy Parametry jako u funkcí (jen na jiném univerzu): data Maybe a = Nothing Just a data (, ) a b = (, ) a b data Either a b = Left a Right b data ( ) a b -- internal Maybe, (, ) a ( ) jsou typové konstruktory (v jazyce typů). Nothing, Just a (, ) jsou datové konstruktory (v jazyce termů). Konvence: Typové a datové konstruktory začínají velkým písmenem. Typové a datové proměnné začínají malým písmenem. (účel: přehlednost kódu, zjednoznačnění některých konstrukcí) 37
49 Parametrické typy data Dvojice a = Dva a a Dva 1 2 :: Dvojice Int Dva (Just 5) Nothing :: Dvojice (Maybe Int) Dva True 3 -- type error 38
50 Seznam data [a] = (a : [a]) [ ]...přeloženo: data [ ] a = (:) a ([ ] a) [ ] 1 : 2 : 3 : [ ] [1, 2, 3] 39
51 Kind Jak se zkontroluje správné použití typů a jejich parametrů? Typům typů se říká Kinds ( druhy ). Všechny typy hodnot patří do druhu. Bool :: Int :: Maybe :: Maybe Int :: [ ] :: ( ) :: RWST :: ( ) Num :: Constraint V ghci se zjistí pomocí :k. 40
52 Ostatní definice typů Typová synonyma (obě strany jsou ekvivalentní): type DvaInty = (Int, Int) Unboxed data (typ se zkontroluje a pak se odmaže): newtype DvaInty = DvaInty (Int, Int) 41
53 Výběr z Prelude fst :: (a, b) a snd :: (a, b) b show :: Show a a String read :: Read a String a putstrln :: String IO () getline :: IO String print :: Show a a IO () readln :: Read a IO a ($) :: (a b) a b ( ) :: (b c) (a b) (a c) 42
54 Výběr ze Prelude seznamy head, last :: [a] a tail, init :: [a] [a] ( +) :: [a] [a] [a] (!!) :: [a] Int a elem :: [a] a Bool length :: [a] Int take, drop :: Int [a] [a] takewhile, dropwhile :: (a Bool) [a] [a] lines, words :: String [String] unlines, unwords :: [String] String map :: (a b) [a] [b] filter :: (a Bool) [a] [a] foldl :: (a x a) a [x] a foldr :: (x a a) a [x] a lookup :: Eq a a [(a, b)] Maybe b 43
55 Dolary a tečky LISP/Python: wordlist docs = sort (nub (concat (map words docs))) Trochu lepší: wordlist docs = sort $ nub $ concat $ map words docs Ještě lepší: wordlist docs = sort nub concat map words $ docs Nejlepší: wordlist = sort nub concat map words 44
56 Jak na IO I/O není vedlejší efekt! Místo toho máme speciální konstrukce, které dovolují hodnoty typu IO a kombinovat a vyrábět z nich větší IO hodnoty. main = do a getline printnums 0 (read a) printnums :: Int Int IO () printnums a b a b = return () otherwise = do print a printnums (a + 1) b main :: IO () je IO akce která popisuje externí komunikaci celého programu. 45
57 Praktikum group [ ] = [ ] group l@(x: _) = takewhile ( x) l : group (dropwhile ( x) l) qsort [ ] = [ ] qsort (x : xs) = qsort a + x : qsort b where a = filter (<x) xs b = filter ( x) xs rle = map (λl (head l, length l)) group 46
58 Praktikum group [ ] = [ ] group l@(x: _) = takewhile ( x) l : group (dropwhile ( x) l) qsort [ ] = [ ] qsort (x : xs) = qsort a + x : qsort b where a = filter (<x) xs b = filter ( x) xs rle = map (λl (head l, length l)) group group :: Eq a [a] [[a]] sort :: Ord a [a] [a] rle :: Eq a [a] [(a, Int)] 46
59 Praktikum laziness fibs = 0 : 1 : zipwith (+) fibs (tail fibs) findmin = head qsort Jakou má časovou složitost findmin? 47
60 Jednodušší typové třídy třída operace Eq ( ), ( ) Ord (<), ( ), compare,... Enum [1..10], [False..] Num (+), ( ), ( ), abs,... Integral div, mod,... Fractional (/),... Floating π, sin, cos, exp, log, logbase, sqrt,... Show show Read read 48
61 Overloading Typové třídy existují kvůli přetěžování funkcí. C-style přetěžování ( ad-hoc overloading ) je možné jen s jednosměrným typovým systémem, v Haskellu by bylo NP-úplné. class Moje a where moje :: a a a instance Moje Int where moje = (+) instance Moje String where moje = ( +) moje moje "ah" "oj" "ahoj" 49
62 Overloading příklad newtype I7 = I7 Int instance Num I7 where (+) = i7lift2 (+) ( ) = i7lift2 ( ) ( ) = i7lift2 ( ) negate = i7lift negate abs = id signum (I7 0) = I7 0 signum = I7 1 frominteger i = I7 $ i mod 7 i7lift f (I7 a) = I7 (f a mod 7) i7lift2 f (I7 a) (I7 b) = I7 (f a b mod 7) 50
63 Overloading příklad 2 data Infinite a = MinusInf Finite a PlusInf instance Ord a Ord (Infinite a) where compare (Finite a) (Finite b) = compare a b compare MinusInf MinusInf = EQ compare MinusInf = LT compare MinusInf = GT compare PlusInf PlusInf = EQ compare PlusInf = GT compare PlusInf = LT 51
64 Overloading příklad 3 instance Num a Num [a] where (+) = zipwith (+) ( ) = zipwith ( ) ( ) = zipwith ( ) negate = map negate abs = map abs signum = map signum frominteger = repeat frominteger 3 [1, 2, 3] + 2 [5, 8, 11] fibs = 0 : 1 : fibs + tail fibs 52
65 Typové třídy nejsou interface! OOP: INumeric dosomething(inumeric a) vs. Haskell: dosomething :: Num a a a Kde je rozdíl? 53
66 Typové třídy nejsou subtyping! C-like: (long)(double)(int)(float)5 je OK, integery jdou automaticky konvertovat. Haskell: ((5 :: Float) :: Int) je chyba! Jak se tedy integer 5 zkonvertuje na float?! 54
67 Typové třídy nejsou subtyping! C-like: (long)(double)(int)(float)5 je OK, integery jdou automaticky konvertovat. Haskell: ((5 :: Float) :: Int) je chyba! Jak se tedy integer 5 zkonvertuje na float?! Desugaring literálů: pětka se přepíše na frominteger 5, kde 5 je pevná Integerová hodnota. frominteger :: Num a Integer a Důsledek: 5 :: Num a (konverze se většinou inlinuje a nemá runtime overhead) 54
68 Moc teoretické? 54
69 Get something cool on screen in 10 minutes! import Graphics.Gloss main = animate FullScreen white $ λt let blink ph sp = (1 + sin (ph + t sp)) / 2 in Pictures $ flip map [1.. 4] $ λx Rotate (90 x + 20 t) $ Translate ( cos t) 0 $ Color (makecolor (blink 0 1) (blink 3 1) (blink 0 π) 1) $ ThickCircle
70 54
71 Pologrupy a monoidy class Semigroup a where ( ) :: a a a class Semigroup a Monoid a where mempty :: a Obecnější operace slepování (píše se jako <>): [1, 2] [4, 5] [1, 2, 4, 5] "ah" "oj" "ahoj" -- i pro Text a ByteString Just [1, 2] Nothing Just [3] Just [1, 2, 3] EQ LT GT LT mempty :: Maybe a Nothing Nad množinou čísel existuje víc monoidů: Sum 5 Sum 3 Sum 8 Product 5 Product 3 Product 15 (mempty :: Product Int) Product 1 55
72 Kontejnerovitost data Tree a = Nil Branch (Tree a) a (Tree a) map (+1) [1, 2, 3] [2, 3, 4] map (+1) (Branch Nil 1 (Branch Nil 2 Nil)) -- error Co takhle přetížit map? 56
73 Kontejnerovitost data Tree a = Nil Branch (Tree a) a (Tree a) map (+1) [1, 2, 3] [2, 3, 4] map (+1) (Branch Nil 1 (Branch Nil 2 Nil)) -- error Co takhle přetížit map? class Functor f where fmap :: (a b) (f a f b) Pozor, f má kind. instance Functor Tree where fmap Nil = Nil fmap f (Branch l a r) = Branch (fmap f l) (f a) (fmap f r) fmap (+1) [1, 2, 3] [2, 3, 4] fmap (+1) (Branch Nil 1 (Branch Nil 2 Nil)) Branch Nil 2 (Branch Nil 3 Nil) 56
74 Kontejnerovitost ( $ ) = fmap ( 2) $ [2, 3, 4] [4, 6, 8] (+1) (+2) $ Just 5 Just 8 uncurry gcd $ Just (1024, 768) Just 256 fmap show $ [Nothing, Just 3, Just 4] [Nothing, Just "3", Just "4"] 57
75 57
76 Rozumné funktory fmap id id fmap f fmap g fmap (f g) 57
77 Funkce jako data Funkce jsou kontejnery na výsledky. Podobně: instance Semigroup b Semigroup (a b) where f g = λa f a g a instance Monoid b Monoid (a b) where mempty = \_ mempty (drop 3 take 3) [1, 2, 3, 4, 5] [4, 5, 1, 2, 3] (drop take) 2 [1, 2, 3, 4, 5] [3, 4, 5, 1, 2] instance Functor (( ) p) where fmap = ( ) fmap :: (a b) ((p a) (p b)) (show $ ( 3)) :: Int String (show $ ( 3)) 3 "9" ( obsah se z kontejneru dostane dodáním parametru) 58
78 Funkce jako data instance Num b Num (a b) where (f + g) x = f x + g x (f g) x = f x g x negate f x = negate (f x) frominteger n x = frominteger n signum f x = signum (f x) abs f x = abs (f x) (sin 2 + cos 2) (sin + 1) (sin + 1) π (negate negate) ((+) ( ))
79 Funkce vs. kontejnery ($) :: (a b) ( a b) map :: (a b) ([a] [b]) fmap :: (a b) (f a f b) :: f (a b) (f a f b) Co když je původní funkce taky v kontejneru? 60
80 Funkce vs. kontejnery Např.: let a = getprogram :: d r b = getdata :: d in a b Když získávání programu nebo dat může selhat, použijeme Maybe: let a = getprogram :: Maybe (d r) b = getdata :: Maybe d in a ap b where ap (Just l) (Just r) = Just (l r) ap = Nothing 61
81 Applicative Koncept aplikace obalené funkce je zachycený ve třídě Applicative: class Functor f Applicative f where pure :: a f a ( ) :: f (a b) f a f b Just show Just 3 Just "3" (pure show pure 3) :: Maybe a Just "3" Nothing Just 3 Nothing Just show Nothing Nothing Just gcd Just 1024 Just 768 Just
82 Instance Applicative instance sémantika Maybe selhávání Either l selhávání s chybou typu l [ ] množiny výsledků výpočtu ( ) p výpočet s globálním parametrem 63
83 Příklady Applicative Just (, ) Just 3 pure 5 Just (3, 5) (, ) $ pure 3 Just 5 Just (3, 5) ((+) $ pure 3 pure 7) :: Either a b Right 10 (+) $ pure 3 Left "sorry error" Left "sorry error" [(+1), (+2), negate] [2, 3, 4] [3, 4, 5, 4, 5, 6, 2, 3, 4] rle = map ( (, ) $ head length) group rle = map (lifta2 (, ) head length) group 64
84 Rozumné aplikativní funktory pure id a a pure (a b) pure a pure b a pure b pure ($b) a a (b c) pure ( ) a b c 64
85 Applicative vs. monoid Užitečná demonstrativní instance: instance Monoid a Applicative ((, ) a) where pure x = (mempty, x) (u, f) (v, x) = (u v, f x) ("hello ", (+17)) ("world!", 2002) ("hello world!", 2019) 65
86 Funkce vs. kontejnery II. ($) :: (a b) ( a b) fmap :: (a b) (f a f b) ( ) :: f (a b) (f a f b) :: (a f b) (f a f b) Jde funkci, jejíž výsledek je obalený nějakou sémantikou (např.: může selhat, nebo možných výsledků může být víc), předělat na funkci, která tento obal spojí s již existujícím obalem? Podobný problém z jiné strany: join :: f (f a) f a 66
87 Spojování Applicative Příklad s Maybe: Nějaké funkce můžou selhat, potřebujeme z nich vyrobit jednu uniformně selhávající funkci. lookup :: Eq a a [(a, b)] Maybe b lookup4 :: Eq a a [(a, a)] Maybe a lookup4 a l = case lookup a l of Nothing Nothing Just a case lookup a l of Nothing Nothing Just a case lookup a l of Nothing Nothing Just a lookup a l SW Engineering: Vytrhněme kus opakujícího se kódu! 67
88 andthen andthen :: Maybe a (a Maybe b) Maybe b andthen Nothing = Nothing andthen (Just a) f = f a lookup4 a l = lookup a l andthen λa lookup a l andthen λa lookup a l andthen λa lookup a l Trochu lepší! 68
89 andthen (na steroidech) infixr 1 andthen lookup4 a l = go a andthen go andthen go andthen go where go a = lookup a l 68
90 Seznamy Úkol: Robot za jednu časovou jednotku může jít do nějakých (na pozici závislých) směrů, tam může udělat nějaké (na pozice závislé) akce, z toho je hromada nových možností kam může dojít. Najděte je. 69
91 directionsat :: Location [Direction] go :: Direction Location Location actionsat :: Location [Action] act :: Action Location Location 70
92 directionsat :: Location [Direction] go :: Direction Location Location actionsat :: Location [Action] act :: Action Location Location...hm. possibleresults :: Location [Location] possibleresults loc = concat $ map (λdir let newloc = go dir loc in map (λaction act action newloc) (actionsat newloc) ) (directionsat loc) 70
93 withcases withcases :: [a] (a [b]) [b] withcases a f = concat (map f a) infixr 2 withcases 71
94 withcases withcases :: [a] (a [b]) [b] withcases a f = concat (map f a) infixr 2 withcases possibleresults loc = directionsat loc withcases λdir let newloc = go dir loc in actionsat newloc withcases λaction [act action newloc] (poslední řádek vrací jednu možnost) 71
95 Generické andthen andthen :: Maybe a (a Maybe b) Maybe b withcases :: [a] (a [b] ) [b] 72
96 Generické andthen andthen :: Maybe a (a Maybe b) Maybe b withcases :: [a] (a [b] ) [b] ($) :: (a b) ( a b) fmap :: Functor f (a b) (f a f b) ( ) :: Applicative f f (a b) (f a f b) flip ( >=) :: Monad m (a m b) (m a m b) Generické andthen a withcases se jmenuje ( >=), čte se bind. 72
97 Monády Jméno: Aplikativní monoid (skoro). class Applicative m Monad m where ( >=) :: m a (a m b) m b ( >) :: m a m b m b return :: a m a ( >) zahodí výsledek, zachová jen změny v obalu. 73
98 Monády alternativně join :: Monad m m (m a) m a V rozumných případech platí: (a >= f) join (f $ a) Pozn.: chování joinu pro seznamy a Maybe: joinl :: [[a]] [a] joinl = concat joinmaybe :: Maybe (Maybe a) Maybe a joinmaybe (Just x) = x joinmaybe = Nothing 74
99 Rozumné monády return a >= f f a a >= return a a >= (λx b x >= c) (a >= b) >= c 74
100 Imperativní syntax Protože používat >= a > je otrava, Haskell má imperativní do-syntax. fn = do a f b g h a b h b a...se přepíše na: fn = f >= λa g >= λb h a b > h b a 75
101 Imperativní syntax lookup4 a l = do a lookup a l a lookup a l a lookup a l a lookup a l return a possibleresults loc = do dir directionsat loc let newloc = go dir loc action actionsat newloc return $ act action newloc 76
102 Philip Lee Wadler 76
103 Philip Lee Wadler The Lambdaman 76
104 List comprehension Speciální syntaxe pro seznamy: possibleresults loc = [act action newloc dir directionsat loc, let newloc = go dir loc, action actionsat newloc] Jednodušší použití: [(x, y) x [1..], y [1.. x], x mod y 0] map f l = [f a a l] filter f l = [a a l, f a] ( podmínky se automaticky obalí pomocí guard) 77
105 Standardní definice Monad Maybe instance Functor Maybe where fmap f (Just x) = Just (f x) fmap Nothing = Nothing instance Applicative Maybe where pure = Just Just f Just a = Just (f a) = Nothing instance Monad Maybe where return = pure Just a >= f = f a >= = Nothing 78
106 Standardní definice Monad [] instance Functor [ ] where fmap = map instance Applicative [ ] where pure x = [x] fs as = concatmap (flip map as) fs instance Monad [ ] where return = pure as >= f = concatmap f as 79
107 Extra příklad: DebugLog Zapišme si postup výpočtu do logu k hodnotě. data Val a = Val a String deriving Show liftval1 op str (Val a loga) = Val (op a) (str + "(" + loga + ")") liftval2 op str (Val a loga) (Val b logb) = Val (a op b) $ concat ["(", loga, ")", str, "(", logb, ")"] instance (Num a, Show a) Num (Val a) where (+) = liftval2 (+) "+" ( ) = liftval2 ( ) "-" ( ) = liftval2 ( ) "*" negate = liftval1 negate "negate" abs = liftval1 abs "abs" frominteger x = Val (frominteger x) (show x) 80
108 Extra příklad: DebugLog (1 + abs (2 negate 3)) :: Val Int Val 7 "(1)+(abs((2)*(negate(3))))" Celý výpočet ale většinou není na jeden řádek... 81
109 Extra příklad: DebugLog instance Functor Val where fmap f (Val a log) = Val (f a) log instance Applicative Val where pure a = Val a "?" Val f logf Val a loga = Val (f a) $ concat ["(", logf, ") (", loga, ")"] instance Monad Val where return = pure Val a loga >= f = let Val b logb = f a in Val b (loga + ";\n" + logb) mkval a = Val a (show a) nameval n (Val a log) = Val (Val a n) $ n + "=" + log 82
110 Extra příklad: DebugLog solve a b c = do let a = mkval a b = mkval b c = mkval c d nameval "D" $ b 2 4 a c ( b + sqrt d) / (2 a) solve 5 3 ( 10) Val "D=((3.0)*(3.0))-(((4)*(5.0))*(-10.0)); ((negate(3.0))+(odmocnina(d)))/((2)*(5.0))" (instanci pro Fractional a Floating někdo doplnil) 83
111 IO Flashback putstrln :: String IO () getline :: IO String main :: IO () main = do putstrln "dej jmeno!" jmeno getline putstrln $ "no nazdar je tady " + jmeno 83
112 Jak se vyrobí IO? Myšlenka: IO akce musí přece manipulovat s nějakým globálním stavem! Vyrobíme monádu, která ukládá stav, na ní pak půjde stavět dál. Požadavky: put :: s m () get :: m s tohle vrátí True: do put a b get return $ a b 84
113 Změna stavu bez vedlejšího efektu stav stav imperativní funkce čistá funkce výsledek stav výsledek 85
114 State newtype State s a = StateChangeWithResult (s (s, a)) s S.C.W.R. s a 85
115 Stavový výpočet je kontejner! instance Functor (State s) where s fmap g change = change s g (x :: a) :: b 86
116 Stavový výpočet je aplikativní! instance Applicative (State s) where s x y = x :: a b y :: a s (x :: a b) (y :: a) :: b 87
117 Stavový výpočet je monáda! instance Monad (State s) where s x >= f = s x f a y s b 88
118 Implementace State newtype State s a = StateChange (s (s, a)) instance Functor (State s) where fmap func (StateChange f) = StateChange (fmap func f) instance Applicative (State s) where pure a = StateChange (λs (s, a)) StateChange f StateChange v = StateChange (λs let (s1, a1) = f s (s2, a2) = v s1 in (s2, a1 a2)) 89
119 Implementace State instance Monad (State s) where return = pure StateChange f1 >= f2 = StateChange (λs let (s, a) = f1 s StateChange f3 = f2 a in f3 s ) 90
120 Manipulace stavu put :: s State s () put ns = StateChange (\_ (ns, ())) get :: State s s get = StateChange (λs (s, s)) modify :: (s s) State s () modify f = StateChange (λs (f s, ())) execstate (StateChange f) s = snd $ f s 91
121 Použití State fact n = execstate (facts n) 1 facts n n 1 = do result get return result otherwise = do modify ( n) facts (n 1) getrand :: Int State Int Int getrand max = do newseed (12345+) ( ) $ get put newseed return $ (newseed div 65536) mod max (viz. man 3 rand) 92
122 Použití State jako Applicative get2rand max = (, ) $ getrand max getrand max 93
123 Použití State jako Applicative get2rand max = (, ) $ getrand max getrand max getnrand max 0 = pure [ ] getnrand max n = (:) $ getrand max getnrand max (n 1) 93
124 Použití State jako Applicative get2rand max = (, ) $ getrand max getrand max getnrand max 0 = pure [ ] getnrand max n = (:) $ getrand max getnrand max (n 1) getnrand max n = mapm (\_ getrand max) [1.. n] getnrand max n = traverse (const $ getrand max) [1.. n] 93
125 Použití State jako Applicative get2rand max = (, ) $ getrand max getrand max getnrand max 0 = pure [ ] getnrand max n = (:) $ getrand max getnrand max (n 1) getnrand max n = mapm (\_ getrand max) [1.. n] getnrand max n = traverse (const $ getrand max) [1.. n] getnrand max n = replicatem n $ getrand max 93
126 Použití State jako Applicative get2rand max = (, ) $ getrand max getrand max getnrand max 0 = pure [ ] getnrand max n = (:) $ getrand max getnrand max (n 1) getnrand max n = mapm (\_ getrand max) [1.. n] getnrand max n = traverse (const $ getrand max) [1.. n] getnrand max n = replicatem n $ getrand max getnrand = flip replicatem getrand 93
127 Pravda o IO $ ghci GHCi, version 8.2.2: Prelude> :i IO newtype IO a = GHC.Types.IO (GHC.Prim.State# GHC.Prim.RealWorld -> (# GHC.Prim.State# GHC.Prim.RealWorld, a #)) 94
128 Kolik paměti spotřebuje uložení RealWorld? 94
129 Kolik paměti spotřebuje uložení RealWorld? Je to jen token typu Void. 94
IB015 Neimperativní programování. Seznamy, Typy a Rekurze. Jiří Barnat Libor Škarvada
IB015 Neimperativní programování Seznamy, Typy a Rekurze Jiří Barnat Libor Škarvada Sekce IB015 Neimperativní programování 02 str. 2/36 Uspořádané n-tice a seznamy Programování a data IB015 Neimperativní
Programovací jazyk Haskell
Programovací jazyk Haskell Ing. Lumír Návrat katedra informatiky, D 403 59 732 3252 Historie září 1991 Gofer experimentální jazyk Mark P. Jones únor 1995 Hugs Hugs98 téměř úplná implementace jazyka Haskell
Programovací í jazyk Haskell
Historie Programovací í jazyk Haskell doc. Dr. Ing. Miroslav Beneš katedra informatiky, A-1007 59 732 4213 září 1991 Gofer experimentální jazyk Mark P. Jones únor 1995 Hugs Hugs98 téměř úplná implementace
IB015 Neimperativní programování. Časová složitost, Typové třídy, Moduly. Jiří Barnat Libor Škarvada
IB015 Neimperativní programování Časová složitost, Typové třídy, Moduly Jiří Barnat Libor Škarvada Sekce IB015 Neimperativní programování 07 str. 2/37 Časová složitost Časová složitost algoritmu IB015
Funkcionální programování. Kristýna Kaslová
Funkcionální programování Kristýna Kaslová Historie Alonzo Church (30. léta) Netypovaný lambda kalkul Základ prvních funkcionálních jazyků Jeho konstrukce i v mnoha současných programovacích jazycích (Python)
Definice uživatelského typu. Uživatelem definované typy. Součinové datové typy. Součtové datové typy. FLP - Uživatelem definované typy
Uživatelem definované typy Ing. Lumír Návrat katedra informatiky, A 1018 59 732 3252 Definice uživatelského typu data Color = Red Green Blue Color typový konstruktor Red / Green / Blue datové konstruktory
Martin Milata, <256615@mail.muni.cz> 27.11.2007. Pokud je alespoň jeden rozměr čokolády sudý (s výjimkou tabulky velikosti 1x2, která už je od
IB000 Lámání čokolády Martin Milata, 27.11.2007 1 Čokoláda s alespoň jedním sudým rozměrem Pokud je alespoň jeden rozměr čokolády sudý (s výjimkou tabulky velikosti 1x2, která už
IB015 Neimperativní programování. Redukční strategie, Seznamy program QuickCheck. Jiří Barnat Libor Škarvada
IB015 Neimperativní programování Redukční strategie, Seznamy program QuickCheck Jiří Barnat Libor Škarvada Sekce IB015 Neimperativní programování 05 str. 2/34 Redukční strategie Redukce, redukční strategie
Parsování v Haskellu, knihovna Parsec
Parsování v Haskellu, knihovna Parsec IB016 Seminář z funkcionálního programování Vladimír Štill, Martin Ukrop Fakulta informatiky, Masarykova univerzita Jaro 2016 IB016: Cvičení 09 Jaro 2016 1 / 12 Regulární
IB015 Neimperativní programování. Organizace a motivace kurzu, programovací jazyk Haskell. Jiří Barnat
IB015 Neimperativní programování Organizace a motivace kurzu, programovací jazyk Haskell Jiří Barnat Sekce IB015 Neimperativní programování 01 str. 2/36 Organizace kurzu Cíle kurzu IB015 Neimperativní
Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program
Denotační sémantika programovacího jazyka doc. Dr. Ing. Miroslav Beneš katedra informatiky, A-1007 59 732 4213 Obsah přednášky Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup
14.4.2010. Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.
Základy programování (IZAPR) Přednáška 7 Ing. Michael Bažant, Ph.D. Katedra softwarových technologií Kancelář č. 229, Náměstí Čs. legií Michael.Bazant@upce.cz Obsah přednášky 7 Parametry metod, předávání
JAVA. Další jazyky kompilovatelné do Java byte-code
JAVA Další jazyky kompilovatelné do Java byte-code Přehled Scala objektový a funkcionální jazyk Closure funkcionální jazyk dialekt Lispu Groovy skritpovací jazyk Kotlin nová Java Jython Java implementace
Motivace. Vstup a výstup. Minimální komunikace. Motivace. ÚDPJ - Vstup a výstup. Ing. Lumír Návrat katedra informatiky, A
Motivace Vstup a výstup Ing. Lumír Návrat katedra informatiky, A-1018 59 732 3252 Načtení čísla val :: Int val = 42 function :: Int -> Int function = val + n inputint :: Int inputdiff = inputint - inputint
Úvod do programovacích jazyků (Java)
Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích
Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016
ZPRO cvičení 2 Martin Flusser Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague October 17, 2016 Outline I 1 Outline 2 Proměnné 3 Proměnné - cvičení 4 Funkce 5 Funkce
Konstruktory překladačů
Konstruktory překladačů Miroslav Beneš Dušan Kolář Konstruktor Lex generátor lexikálních analyzátorů M. E. Lesk, 1975 - pro OS Unix flex - Vern Paxson, 1990 - GNU verze určeno pro generování výstupu v
Zápis programu v jazyce C#
Zápis programu v jazyce C# Základní syntaktická pravidla C# = case sensitive jazyk rozlišuje velikost písmen Tzv. bílé znaky (Enter, mezera, tab ) ve ZK překladač ignoruje každý příkaz končí ; oddělovač
Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií
1 Fakulta elektrotechniky a informatiky Katedra softwarových technologií 12. října 2009 Organizace výuky Přednášky Teoretické základy dle normy jazyka C Cvičení Praktické úlohy odpřednášené látky Prostřední
Jazyk C# (seminář 6)
Jazyk C# (seminář 6) Pavel Procházka KMI 29. října 2014 Delegát motivace Delegáty a události Jak docílit v C# funkcionální práce s metodami v C je to pomocí pointerů na funkce. Proč to v C# nejde pomocí
8 Třídy, objekty, metody, předávání argumentů metod
8 Třídy, objekty, metody, předávání argumentů metod Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost třídám a objektům, instančním
NPRG030 Programování I, 2018/19 1 / :25:37
NPRG030 Programování I, 2018/19 1 / 26 24. 9. 2018 10:25:37 Čísla v algoritmech a programech 10 26 Poloměr vesmíru 2651 studujících studentů MFF UK 3.142857... Ludolfovo číslo 10 16 stáří vesmíru v sekundách!!!
Algoritmizace a programování
Algoritmizace a programování Struktura programu Vytvoření nové aplikace Struktura programu Základní syntaktické elementy První aplikace Verze pro akademický rok 2012/2013 1 Nová aplikace NetBeans Ve vývojovém
Programovací jazyk Pascal
Programovací jazyk Pascal Syntaktická pravidla (syntaxe jazyka) přesná pravidla pro zápis příkazů Sémantická pravidla (sémantika jazyka) pravidla, která každému příkazu přiřadí přesný význam Všechny konstrukce
IB111 Programování a algoritmizace. Objektově orientované programování (OOP)
IB111 Programování a algoritmizace Objektově orientované programování (OOP) OP a OOP Objekt Kombinuje data a funkce a poskytuje určité rozhraní. OP = objektové programování Vše musí být objekty Např. Smalltalk,
Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007
Úvod do programovacích jazyků (Java) Michal Krátký 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků
IB111 Programování a algoritmizace. Programovací jazyky
IB111 Programování a algoritmizace Programovací jazyky Programovací jazyky Programovací jazyk Prostředek pro zápis algoritmů, jež mohou být provedeny na počítači Program Zápis algoritmu v programovacím
1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5
Obsah Obsah 1 Programovací jazyk Pascal 1 1.1 Struktura programu v Pascalu.................... 1 2 Proměnné 2 2.1 Vstup a výstup............................ 3 3 Operátory a některé matematické funkce 5
7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd
7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd Algoritmizace (Y36ALG), Šumperk - 7. přednáška 1 Třída jako zdroj funkcionality Třída v jazyku Java je programová jednotka tvořená
Paměť počítače. alg2 1
Paměť počítače Výpočetní proces je posloupnost akcí nad daty uloženými v paměti počítače Data jsou v paměti reprezentována posloupnostmi bitů (bit = 0 nebo 1) Připomeňme: paměť je tvořena řadou 8-mi bitových
DSL manuál. Ing. Jan Hranáč. 27. října 2010. V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v
DSL manuál Ing. Jan Hranáč 27. října 2010 V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v současné době krátký) seznam vestavěných funkcí systému. 1 Vytvoření nového dobrodružství Nejprve
Dědění, polymorfismus
Programování v jazyce C/C++ Ladislav Vagner úprava Pavel Strnad Dědění. Polymorfismus. Dnešní přednáška Statická a dynamická vazba. Vnitřní reprezentace. VMT tabulka virtuálních metod. Časté chyby. Minulá
Úvod do programovacích jazyků (Java)
Úvod do programovacích jazyků (Java) Michal Krátký Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2007/2008 c 2006 2008 Michal Krátký Úvod do programovacích
8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek
8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek 1/41 Základní příkazy Všechny příkazy se píšou malými písmeny! Za většinou příkazů musí být středník (;)! 2/41 Základní příkazy
Functional and Logic Programming Functional languages
Functional and Logic Programming Functional languages Ing. Marek Běhálek FEI VŠB-TUO A-1018 / 597 324 251 http://www.cs.vsb.cz/behalek marek.behalek@vsb.cz This presentation is based on original course
KTE / ZPE Informační technologie
4 KTE / ZPE Informační technologie Ing. Petr Kropík, Ph.D. email: pkropik@kte.zcu.cz tel.: +420 377 63 4639, +420 377 63 4606 (odd. informatiky) Katedra teoretické elektrotechniky FEL ZČU Plzeň Největší
Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15
Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15 KAPITOLA 1 Úvod do programo vání v jazyce C++ 17 Základní pojmy 17 Proměnné a konstanty 18 Typy příkazů 18 IDE integrované vývojové
24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1
24-2-2 PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE AUTOR DOKUMENTU: MGR. MARTINA SUKOVÁ DATUM VYTVOŘENÍ: 23.7.2013 KLÍČOVÁ AKTIVITA: 02 UČIVO: STUDIJNÍ OBOR: PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) INFORMAČNÍ TECHNOLOGIE
Jazyk C++ I. Šablony 2
Jazyk C++ I Šablony 2 AR 2013/2014 Jazyk C++ I Třídy template class TVektor { T *a; int n; static int PocInstanci; public: TVektor(int _n = 0) : n(_n) { a = new T[n]; PocInstanci++; } ~TVektor()
MAXScript výukový kurz
MAXScript výukový kurz Díl čtvrtý jazyk MAXScript, část I. Jan Melichar, březen 2008 Jan Melichar (aka JME) strana 1 OBSAH ÚVOD... 4 ZÁKLADNÍ PŘÍKAZY... 5 OPERÁTORY... 6 PROMĚNNÉ... 6 POLE... 7 ZÁVĚREM...
Objektově orientované programování
10. října 2011 Pragmatické informace Volitelný předmět, zápočet: zápočtový program(s dokumentací), aktivní účast na cvičení(body v CodExu), praktický test, zkouška: zkoušková písemka na objektový návrh
Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!
Java práce s řetězci Trochu povídání.. Řetězce jsou v Javě reprezentovány instancemi tříd StringBuffer a String. Tyto třídy jsou součástí balíčku java.lang, tudíž je možno s nimi pracovat ihned bez nutného
Programování v jazyce JavaScript
Programování v jazyce JavaScript Katedra softwarového inženýrství Fakulta informačních technologií České vysoké učení technické v Praze Pavel Štěpán, 2011 Syntaxe 1. část BI-JSC Evropský sociální fond
PB161 Programování v jazyce C++ Přednáška 7
PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z
Funkcionální programování Haskell
Funkcionální programování Haskell Jan Hric, KTIML MFF UK,1997-2018d http://ktiml.ms.mff.cuni.cz/~hric/ Jan.Hric@mff.cuni.cz Funkcionální programování Programování s pomocí funkcí program = definice funkcí
PB161 Programování v jazyce C++ Přednáška 7
PB161 Programování v jazyce C++ Přednáška 7 Statické položky tříd Základy OOP Nikola Beneš 6. listopadu 2018 PB161 přednáška 7: static, základy OOP 6. listopadu 2018 1 / 21 Klíčové slovo static Znáte z
Funkcionální programování Haskell
Funkcionální programování Haskell Jan Hric, KTIML MFF UK,1997-2016a http://ktiml.ms.mff.cuni.cz/~hric/ Jan.Hric@mff.cuni.cz Funkcionální programování Historicky: lambda-kalkul, cca. 1940 LISP, 1959-1960...Scheme,
2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.
Informatika 10. 9. 2013 Jméno a příjmení Rodné číslo 1) Napište algoritmus pro rychlé třídění (quicksort). 2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus
PREPROCESOR POKRAČOVÁNÍ
PREPROCESOR POKRAČOVÁNÍ Chybová hlášení V C# podobně jako v C++ existuje direktiva #error, která způsobí vypsání chybového hlášení překladačem a zastavení překladu. jazyk C# navíc nabízí direktivu #warning,
NPRG030 Programování I, 2016/17 1 / :58:13
NPRG030 Programování I, 2016/17 1 / 31 10. 10. 2016 10:58:13 Podmínka = něco, co JE, nebo NENÍ splněno typ Boolean hodnoty: TRUE pravda FALSE lež domluva (optimistická): FALSE < TRUE NPRG030 Programování
11. Přehled prog. jazyků
Jiří Vokřínek, 2016 B6B36ZAL - Přednáška 11 1 Základy algoritmizace 11. Přehled prog. jazyků doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze
typová konverze typová inference
Seminář Java Programování v Javě II Radek Kočí Fakulta informačních technologií VUT Únor 2008 Radek Kočí Seminář Java Programování v Javě (2) 1/ 36 Téma přednášky Rozhraní: použití, dědičnost Hierarchie
Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false
Logické operace Datový typ bool může nabýt hodnot: o true o false Relační operátory pravda, 1, nepravda, 0, hodnoty všech primitivních datových typů (int, double ) jsou uspořádané lze je porovnávat binární
Základy jazyka C# Obsah přednášky. Architektura.NET Historie Vlastnosti jazyka C# Datové typy Příkazy Prostory jmen Třídy, rozhraní
Základy jazyka C# doc. Ing. Miroslav Beneš, Ph.D. katedra informatiky FEI VŠB-TUO A-1007 / 597 324 213 http://www.cs.vsb.cz/benes Miroslav.Benes@vsb.cz Obsah přednášky Architektura.NET Historie Vlastnosti
Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007
Úvod do programovacích jazyků (Java) Michal Krátký 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programovacích jazyků (Java), 2006/2007 c 2006 Michal Krátký Úvod do programovacích jazyků
Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C
Identifikační údaje školy Číslo projektu Název projektu Číslo a název šablony Autor Tematická oblast Číslo a název materiálu Anotace Vyšší odborná škola a Střední škola, Varnsdorf, příspěvková organizace
PŘETĚŽOVÁNÍ OPERÁTORŮ
PŘETĚŽOVÁNÍ OPERÁTORŮ Jazyk C# podobně jako jazyk C++ umožňuje přetěžovat operátory, tj. rozšířit definice některých standardních operátorů na uživatelem definované typy (třídy a struktury). Stejně jako
PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory
PB161 Programování v C++ Proudy pro standardní zařízení Souborové proudy Paměťové proudy Manipulátory Výhody objektového řešení Nástroje pro IO operace jsou v C++ součástí knihoven Hierarchie objektových
První kapitola úvod do problematiky
První kapitola úvod do problematiky Co je to Flex Adobe Flex je ActionSript (AS) framework pro tvorbu Rich Internet Aplications (RIA), tedy knihovna AS tříd pro Flash. Flex používáme k vytvoření SWF souboru
IB111 Úvod do programování skrze Python Přednáška 13
IB111 Úvod do programování skrze Python Přednáška 13 Programovací jazyky Nikola Beneš 14. prosinec 2016 IB111 přednáška 13: programovací jazyky 14. prosinec 2016 1 / 21 Osnova dnešní přednášky Programovací
PB161 6. přednáška (26. října 2015)
PB161 6. přednáška (26. října 2015) Standardní knihovna C++ obsahuje řadu částí, některé už jsme viděli (strings, I/O streams) mimo jiné obsahuje i knihovní funkce ze standardní knihovny jazyka C jiné
Hrátky s funkcemi. PV173 Programování v C++11. Vladimír Štill, Jiří Weiser. Fakulta Informatiky, Masarykova Univerzita. 29.
Hrátky s funkcemi PV173 Programování v C++11 Vladimír Štill, Jiří Weiser Fakulta Informatiky, Masarykova Univerzita 29. září 2014 Hrátky s funkcemi PV173 29. září 2014 1 / 23 Úvod Na co se podíváme? předávání
1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:
1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.
Výčtový typ strana 67
Výčtový typ strana 67 8. Výčtový typ V této kapitole si ukážeme, jak implementovat v Javě statické seznamy konstant (hodnot). Příkladem mohou být dny v týdnu, měsíce v roce, planety obíhající kolem slunce
Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7
Pascal Katedra aplikované kybernetiky Ing. Miroslav Vavroušek Verze 7 Proměnné Proměnná uchovává nějakou informaci potřebnou pro práci programu. Má ve svém oboru platnosti unikátní jméno. (Připadne, musí
Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David
Úvod do Prologu Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David Warren (Warren Abstract Machine) implementace
1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:
1. lekce 1. Minimální program do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: #include #include int main() { printf("hello world!\n"); return 0; 2.
PB161 Základy OOP. Tomáš Brukner
PB161 Základy OOP Tomáš Brukner Sylabus - Co je to OOP? Jaké jsou základní principy OOP? Jak se projevují v C++? https://cs.wikipedia.org/wiki/strahovská_knihovna SELECT * FROM books WHERE pages < 250
Úvod do programování - Java. Cvičení č.4
Úvod do programování - Java Cvičení č.4 1 Sekvence (posloupnost) Sekvence je tvořena posloupností jednoho nebo více příkazů, které se provádějí v pevně daném pořadí. Příkaz se začne provádět až po ukončení
Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky
Vyučovací hodina 1vyučovací hodina: Opakování z minulé hodiny Nová látka Procvičení nové látky Shrnutí 5 min 20 min 15 min 5 min 2vyučovací hodiny: Opakování z minulé hodiny Nová látka Procvičení nové
Funkcionální programování Haskell
Funkcionální programování Haskell Jan Hric, KTIML MFF UK,1997-2012f http://ktiml.ms.mff.cuni.cz/~hric/ Jan.Hric@mff.cuni.cz Historicky: Funkcionální programování lambda-kalkul, cca. 1940 LISP, 1959-1960...Scheme,
PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ
KATEDRA INFORMATIKY, PŘÍRODOVĚDECKÁ FAKULTA UNIVERZITA PALACKÉHO, OLOMOUC PARADIGMATA PROGRAMOVÁNÍ 2 PŘÍSLIBY A LÍNÉ VYHODNOCOVÁNÍ Slajdy vytvořili Vilém Vychodil a Jan Konečný (KI, UP Olomouc) PP 2, Lekce
Následující tabulka obsahuje typy objektů podle jejich pojmenovávání: počáteční písmeno jména
Jména objektů Každý objekt ve Smalltalku může mít svoje jméno. Jménem rozumíme alfanumerické označení, které musí začínat písmenem. Ve Smalltalku jsou důsledně rozlišována velká a malá písmena, na což
Algoritmizace a programování
Algoritmizace a programování Typy Základní (primitivní) datové typy Deklarace Verze pro akademický rok 2012/2013 1 Typy v jazyce Java Základní datové typy (primitivní datové typy) Celočíselné byte, short,
PB161 Programování v jazyce C++ Přednáška 9
PB161 Programování v jazyce C++ Přednáška 9 Právo friend Přetěžování operátorů Nikola Beneš 16. listopadu 2015 PB161 přednáška 9: friend, přetěžování operátorů 16. listopadu 2015 1 / 30 Reklama PB173 Tematicky
Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy
Úvod do programování Michal Krátký 1,Jiří Dvorský 1 1 Katedra informatiky VŠB Technická univerzita Ostrava Úvod do programování, 2004/2005 Procesor Procesorem je objekt, který vykonává algoritmem popisovanou
EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI
EVROPSKÝ SOCIÁLNÍ FOND Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI Úvod do PHP PHP Personal Home Page Hypertext Preprocessor jazyk na tvorbu dokumentů přípona: *.php skript je součást HTML stránky!
Úvod do programování
Úvod do programování Základní literatura Töpfer, P.: Algoritmy a programovací techniky, Prometheus, Praha učebnice algoritmů, nikoli jazyka pokrývá velkou část probíraných algoritmů Satrapa, P.: Pascal
7 Formátovaný výstup, třídy, objekty, pole, chyby v programech
7 Formátovaný výstup, třídy, objekty, pole, chyby v programech Studijní cíl Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost formátovanému výstupu,
- speciální symboly + - * / =., < > <> <= >= a další. Klíčová slova jsou chráněnými útvary, které nelze použít ve významu identifikátorů.
Základní symboly - písmena A B C Y Z a b c y z - číslice 0 1 2 9 - speciální symboly + - * / =., < > = a další - klíčová slova and array begin case const a další Klíčová slova jsou chráněnými útvary,
Java Cvičení 01. CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics
Java Cvičení 01 http://d3s.mff.cuni.cz CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics Příklady - Porovnání Co kód vypíše? package cz.cuni.mff.java.example01.tests; public class Test01
Přednáška 3. Rekurze 1
Paradigmata programování 1 Přednáška 3. Rekurze 1 Michal Krupka KATEDRA INFORMATIKY UNIVERZITA PALACKÉHO V OLOMOUCI Obsah 1 Příklady 2 Rekurzivní procedury a rekurzivní výpočetní proces 3 Další příklady
Algoritmizace a programování
Algoritmizace a programování Řídicí struktury jazyka Java Struktura programu Příkazy jazyka Blok příkazů Logické příkazy Ternární logický operátor Verze pro akademický rok 2012/2013 1 Struktura programu
Jazyk C++ I. Polymorfismus
Jazyk C++ I Polymorfismus AR 2013/2014 Jazyk C++ I Operátory Co to vůbec jsou operátory? Na co je používáme? AR 2013/2014 Jazyk C++ I 2 Operátory Můžeme si upravit operátory pro vlastní objektové typy?
Jazyk C# a platforma.net
Jazyk C# a platforma.net Katedra softwarového inženýrství Fakulta informačních technologií České vysoké učení technické v Praze Pavel Štěpán, 2011 Syntaxe jazyka C# - 1. část BI-DNP Evropský sociální fond
Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006
Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/04.0006 Lekce 1 Jazyk Java Tento projekt je spolufinancován Evropským sociálním fondem
Abstraktní datové typy
Karel Müller, Josef Vogel (ČVUT FIT) Abstraktní datové typy BI-PA2, 2011, Přednáška 10 1/27 Abstraktní datové typy Ing. Josef Vogel, CSc Katedra softwarového inženýrství Katedra teoretické informatiky,
Programování v C++, 2. cvičení
Programování v C++, 2. cvičení 1 1 Fakulta jaderná a fyzikálně inženýrská České vysoké učení technické v Praze Zimní semestr 2018/2019 Přehled 1 Operátory new a delete 2 3 Operátory new a delete minule
Maturitní otázky z předmětu PROGRAMOVÁNÍ
Wichterlovo gymnázium, Ostrava-Poruba, příspěvková organizace Maturitní otázky z předmětu PROGRAMOVÁNÍ 1. Algoritmus a jeho vlastnosti algoritmus a jeho vlastnosti, formy zápisu algoritmu ověřování správnosti
Mnohotvarost (polymorfizmus)
Mnohotvarost (polymorfizmus) TYPY MNOHOTVAROSTI... 2 PŘETĚŽOVÁNÍ METOD, PŘETĚŽOVÁNÍ OPERACÍ... 3 PŘETÍŽENÍ OPERÁTORŮ... 4 ČASTO PŘETĚŽOVANÉ OPERÁTORY... 4 PŘEPISOVÁNÍ... 7 VIRTUÁLNÍ METODY... 10 SEZNAM
Funkcionální programování
Funkcionální programování Typované - Haskell Netypované - Lisp, Scheme λ-kalkul Teoretický základ funkcionálniho programování Lambda kalkul analyzuje funkce nikoli z hlediska původního matematického smyslu
VISUAL BASIC. Práce se soubory
VISUAL BASIC Práce se soubory Práce se soubory 1/2 2 Vstupní data pro programy bývají uloženy do souborů Vstupy pro výpočet, nastavení vzhledu aplikace Výsledky práce programu je potřeba uchovat uložit
Programování v jazyce C pro chemiky (C2160) 12. Specifické problémy při vývoji vědeckého softwaru
Programování v jazyce C pro chemiky (C2160) 12. Specifické problémy při vývoji vědeckého softwaru Reprezentace reálnách čísel v počítači Reálná čísla jsou v počítači reprezentována jako čísla tvaru ±x
Programování v Javě I. Leden 2008
Seminář Java Programování v Javě I Radek Kočí Fakulta informačních technologií VUT Leden 2008 Radek Kočí Seminář Java Programování v Javě (1) 1/ 45 Téma přednášky Datové typy Deklarace třídy Modifikátory
Regulární výrazy. Vzory
Regulární výrazy Regulární výrazy jsou určeny pro práci s textovými řetězci, jsou součástí J2SDK až od verze 1.4, v předchozích verzích je potřeba použít některou z externích knihoven, např. knihovnu ORO
5a. Makra Visual Basic pro Microsoft Escel. Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina
5a. Makra Visual Basic pro Microsoft Escel Vytvořil Institut biostatistiky a analýz, Masarykova univerzita J. Kalina Cyklické odkazy a iterativní výpočty Zde bude stránka o cyklických odkazech a iteracích.
Haskell Hero učební text
Haskell Hero učební text Stanislav Novák, StaNov@mail.muni.cz 22. května 2011 Tento sáhodlouhý dokument obsahuje učební text webové podoby učebnice Haskell Hero ke dni uvedenému výše. Text byl převeden
infixr 0 $! ($!) :: (a->b) -> a -> b f $! x =... interni, pro striktni vyhodnocovani -- vyhodnoti top konstruktor x -}
-- literate haskell.lhs -- radky zacinaji > {- > lhsfunkce x = lhstelo (x * x) > where > lhstelo y = y div 2 -- z prelude foldr :: (a->b->b) -> b -> [a] -> b foldr f v [] = v foldr f v (x:xs) = f x (foldr
Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b
Výrazy a operátory i = 2 i = 2; to je výraz to je příkaz 4. Operátory Unární - unární a unární + Např.: +5-5 -8.345 -a +b - unární ++ - inkrement - zvýší hodnotu proměnné o 1 - unární -- - dekrement -