Programozás burritokkal

Hasonló dokumentumok
Funkcionális Nyelvek 2 (MSc)

Tulajdonságalapú tesztelés

Tisztán funkcionális adatszerkezetek

Tisztán funkcionális adatszerkezetek (folytatás)

Tisztán funkcionális adatszerkezetek (folytatás)

2018, Funkcionális programozás

2018, Funkcionális programozás

Lineáris belsőpontos Newton-iteráció

2016, Funkcionális programozás

HASKELL. Tartalom előadás

Tartalom előadás

2018, Funkcionális programozás

DSL-eket kétféleképpen szoktak megvalósítani:

Párhuzamos programozás Haskellben (folytatás)

S2-01 Funkcionális nyelvek alapfogalmai

2019, Funkcionális programozás. 5. el adás. MÁRTON Gyöngyvér

2018, Funkcionális programozás

Programok értelmezése

BASH script programozás II. Vezérlési szerkezetek

Funkcionális programozás

Apple Swift kurzus 3. gyakorlat

2016, Funkcionális programozás

Kifejezések. Kozsik Tamás. December 11, 2016


S z á m í t ó g é p e s a l a p i s m e r e t e k

XML adatkezelés. 11. témakör. Az XQuery nyelv alapjai. XQuery. XQuery célja egy imperatív lekérdező nyelv biztosítása. XQuery.

Egyszabadságfokú grejesztett csillapított lengõrendszer vizsgálata

FUNKCIONÁLIS PROGRAMOZÁS GYAKORLAT JEGYZET

Példa: Aktuális könyvtár tartalmának fájlba mentése, melynek neve az aktuális dátum és idő: ls l > `date+%f_%h-%m`.txt

Programozás II. 2. Dr. Iványi Péter





























Java-ról Kotlinra. Ekler Péter AutSoft BME AUT. AutSoft

Kifejezések. Kozsik Tamás. December 11, 2016

Webes alkalmazások fejlesztése 8. előadás. Webszolgáltatások megvalósítása (ASP.NET WebAPI)

Imperatív programozás

Algoritmizálás + kódolás C++ nyelven és Pascalban

Programozás alapjai. 5. előadás

Operációs Rendszerek II. labor. 2. alkalom

Széchenyi István Egyetem

Az arrow struktúra. Patai Gergely április 1.

2019, Funkcionális programozás. 2. el adás. MÁRTON Gyöngyvér

Fejlett programozási nyelvek C++ Iterátorok

Kivételek kezelése (exception handling) Hibakezelés old style. Kivételkezelés

Vektoros grafikát tároló adatbázisok. Katona Endre Térképi adatbázisok diasorozata alapján

Powershell 2. gyakorlat

Programozás II. 4. Dr. Iványi Péter

Diszkrét Matematika. zöld könyv ): XIII. fejezet: 1583, 1587, 1588, 1590, Matematikai feladatgyűjtemény II. (

Doktori értekezés. Diviánszky Péter 2012.

Matematikai statisztikai programcsomagok gyakorlat

Csomag. Adatbázis-objektum Programozási eszközök gyűjteménye Két részből áll. specifikáció törzs (opcionális)

Java II. I A Java programozási nyelv alapelemei

Sztringkezelő függvények. A string típusú változók kezelése, használata és szerepük a feldolgozás során

Kiterjesztések sek szemantikája

Szövegek C++ -ban, a string osztály

Objektumorientált programozás C# nyelven

FFT. Második nekifutás. Czirbusz Sándor ELTE IK, Komputeralgebra Tanszék október 2.

A függvény kód szekvenciáját kapcsos zárójelek közt definiáljuk, a { } -ek közti részt a Bash héj kód blokknak (code block) nevezi.

u u IR n n = 2 3 t 0 <t T

5. előadás Parametrikus polimorfizmus. Generikus programozás. Az Ada sablonok.

E- Laboratórium 3 Az ABB robotok alkalmazásai Elméleti leírás

file./script.sh > Bourne-Again shell script text executable << tartalmat néz >>

Algoritmizálás és adatmodellezés tanítása 1. előadás

Miskolci Egyetem Gazdaságtudományi Kar Üzleti Információgazdálkodási és Módszertani Intézet. Hypothesis Testing. Petra Petrovics.

Adatbázisok II. Jánosi-Rancz Katalin Tünde 327A

Szkriptnyelvek. 1. UNIX shell

1. Alapok. Programozás II

2018, Funkcionális programozás

C#, OOP. Osztályok tervezése C#-ban

Pénzügyi algoritmusok

4 Approximációs algoritmusok szorzatalakú hálózatok esetén

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós május 6. Széchenyi István Egyetem, Gy r

Táblakezelés: Open SQL Internal table. Tarcsi Ádám: Az SAP programozása 1.

PHP alapjai, bevezetés. Vincze Dávid Miskolci Egyetem, IIT

Átírás:

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 β (x >>= f ) w = (f x ) w mod where (x, w mod ) = x w (>>) :: IO α IO β IO β x >> f = f >>= λ _. f program :: IO () program = putstr Provide me a word > >> getline >>= λ s. if (s reverse s) then putstr A palindrome. else putstr Not a palindrome. [3..21]

Programozás monádokkal: A Monad típusosztály -- Control.Monad class Applicative µ Monad (µ :: ) where return :: α µ α return = pure (>>=) :: µ α (α µ β) µ β (>>) :: µ α µ β µ β x >> f = x >>= λ _. f fail :: String µ α fail = error (>=>) :: Monad µ (α µ β) (β µ γ) (α µ γ) f >=> g = λ x. f x >>= g Monádtörvények: return >=> f f f >=> return f (f >=> g) >=> h f >=> (g >=> h) + run függvény [4..21]

Programozás monádokkal: A do szintaktika Átírási szabályok: do { e 1 ; e 2 } e 1 >> do { e 2 } do { p e 1 ; e 2 } e 1 >>= λ x. case x of p do { e 2 } _ fail error do { let p = e1; e2 } let p = e 1 in do { e 2 } do { e } e Például: do { do x f ; x f f >>= λ x. y g; y g g >>= λ y. z h; z h h >>= λ z. let t = (x, y, z); let t = (x, y, z) let t = (x, y, z) in return t return t return t } [5..21]

Monádtörvények a gyakorlatban return >=> f f : do x m do m return x f >=> return f : do y return x do f x f y (f >=> g) >=> h f >=> (g >=> h) : do y do x m do x m do x m f x y f x do y f x g y g y g y [6..21]

Milyen monádok léteznek? data IO α =? Az IO monáddal tetszőleges mellékhatást tudunk modellezni, ez a jolly joker. Például: putstrln: írás a szabványos kimenetre getline: olvasás a szabványos bemenetről IORef : módosítható hivatkozások, mutatók IOError: kivétel(kezelés) IOArray: hatékony, felülírható elemeket tartalmazó tömb forkio: (konkurens) szálak létrehozása run függvény: a futtató rendszer, unsafeperformio [7..21]

Ilyen monádok léteznek? data [α] = [] α : [α] instance Monad [] where return x = [x] -- α [α] xs >>= f = concat [ f x x xs ] -- [α] (α [β]) [β] fail _ = [] -- String [α] multiplytonm :: (Num α, Eq α, Enum α) α [(α, α)] multiplytonm n = do x [1..n] y [x..n] if (x y n) then return (x, y) else fail Not applicable. multiplyton n = [ (x, y) x [1..n], y [x..n], x y n ] [8..21]

Az Identity monád (intuíció) type Identity α = α -- α (α β) β (>>=) :: Identity α (α Identity β) Identity β x >>= f = f x -- α α return :: α Identity α return x = x -- α α runidentity :: Identity α α runidentity x = x [9..21]

Az Identity monád (definíció) -- Control.Monad.Identity data Identity α = I α runidentity :: Identity α α runidentity (I x) = x instance Monad Identity where return x = I x x >>= f = f (runidentity x) [10..21]

Az Identity monád (példa) m :: Int Identity Int m x = return (x x) m 1 :: Int Identity Int m 1 x = do return (x x) return (x 2) return (x 3) m 2 :: Int Identity Int m 2 n = do x m 1 n y return (x n) m y y = runidentity (m 2 4) [11..21]

A Maybe monád data Maybe α = Just α Nothing instance Monad Maybe where -- (>>=) :: Maybe α (α Maybe β) Maybe β (Just x) >>= f = f x Nothing >>= f = Nothing -- return :: α Maybe α return = Just testmaybe :: Maybe Int testmaybe = Just 3 >>= λ x. Just 4 >>= λ y. return (x + y) [12..21]

A Reader monád (intuíció) type Reader ε α = ε α -- (ε α) (α (ε β)) (ε β) (>>=) :: Reader ε α (α Reader ε β) Reader ε β (x >>= f ) e = f (x e) e -- α (ε α) return :: α Reader ε α (return x) e = x -- ε ε ask :: Reader ε ε (ask) e = e -- (ε α) ε α runreader :: Reader ε α ε α runreader f = f [13..21]

A Reader monád (definíció) -- Control.Monad.Reader newtype Reader ε α = R (ε α) runreader :: Reader ε α ε α runreader (R f ) = f instance Monad (Reader ε) where return x = R $ λ e. x x >>= f = R $ λ e. let x 1 = runreader x e in runreader (f x 1 ) e ask :: Reader ε ε ask = R (λ e. e) [14..21]

A Reader monád (példa) type Identifier = String type Bindings α = Data.Map.Map Identifier α valueof :: Identifier Bindings α α valueof name binds = maybe (error Not found ) id (Data.Map.lookup name binds) bindings :: [(Identifier, α)] Bindings α bindings = Data.Map.fromList -- getvaluesm :: [Identifier] Bindings α [α] getvaluesm :: [Identifier] Reader (Bindings α) [α] getvaluesm ids = do binds ask return [ valueof id binds id ids ] getvalues :: [Identifier] Bindings α [α] getvalues ids names = runreader (getvaluesm ids) names [15..21]

A State monád (intuíció) type State σ α = σ (α, σ) -- (σ (α, σ)) (α (σ (β, σ))) (σ (β, σ)) (>>=) :: State σ α (α State σ β) State σ β (x >>= f ) s = (f v) s mod where (v, s mod ) = x s -- α (σ (α, σ)) return :: α State σ α (return x) s = (x, s) -- σ (σ, σ) get :: State σ σ (get) s = (s, s) -- σ ((), σ) put :: σ State σ () (put x) s = ((), x) -- (σ (α, σ)) σ (α, σ)) runstate :: State σ α σ (α, σ)) runstate f = f [16..21]

A State monád (definíció) -- Control.Monad.State newtype State σ α = S (σ (α, σ)) runstate :: State σ α σ (α, σ) runstate (S f ) = f instance Monad (State σ) where return x = S $ λ s. (x, s)) x >>= f = S $ λ s. let (y, s mod ) = runstate x s in runstate (f y) s mod get :: State σ σ get = S $ λ s. (s, s) put :: σ State σ () put x = S $ λ _. ((), x) [17..21]

A State monád (példa) data Tree α = Node a (Tree a) (Tree a) Leaf deriving Show numbertree :: (Eq α) Tree α Tree Int numbertree t = fst (runstate (numbertreem t) []) numbertreem :: (Eq α) Tree α State [α] (Tree Int) numbertreem Leaf = return Leaf numbertreem (Node x lt rt) = do table get let (table mod, pos) = case (Data.List.findIndex ( x) table) of Just i (table, i) _ (table + + [x], length table) put table mod lt mod numbertreem lt rt mod numbertreem rt return (Node pos lt mod rt mod ) [18..21]

A Writer monád (egyszerűsített) -- Control.Monad.Writer newtype Writer ω α = W (α, ω) runwriter :: (Monoid ω) Writer ω α (α, ω) runwriter (W (x, w)) = (x, w) instance (Monoid ω) Monad (Writer ω) where return x = W (x, mempty) x >>= f = W $ let (x 1, w 1 ) = runwriter x in let (x 2, w 2 ) = runwriter (f x 1 ) in (x 2, w 1 <> w 2 ) tell :: (Monoid ω) ω Writer ω () tell x = W ((), x) censor :: (Monoid ω) (ω ω) Writer ω α Writer ω α censor f (W (x, w)) = W (x, f w) [19..21]

A Writer monád (Monoid) -- Data.Monoid class Monoid α where mempty :: α mappend :: α α α (<>) :: (Monoid α) α α α (<>) = mappend Monoidtörvények: mempty <> x x x <> mempty x x <> (y <> z) (x <> y) <> z mconcat foldr (<>) mempty Például: instance Monoid [α] where mempty = [] mappend = (++) instance (Monoid α, Monoid β) Monoid (α, β) where mempty = (mempty, mempty) mappend (x 1, y 1 ) (x 2, y 2 ) = (x 1 <> x 2, y 1 <> y 2 ) [20..21]

A Writer monád (példa) gcdwithlog :: Int Int (Int, [String]) gcdwithlog x y = runwriter (censor reverse (gcdwithlogm x y)) gcdwithlogm :: Int Int Writer [String] Int gcdwithlogm x y y 0 = do tell [ Finished with + + show x] return x gcdwithlogm x y = do result gcdwithlogm y (x mod y) let msg = show x + + mod + + show y + + = + + show (x mod y) tell [msg] return result [21..21]