Skeemid Eesmärk: esitada riistvara skeeme ja teisi andmevoodiagrammidel baseeruvaid kirjeldusi Haskellis VARMO VENE 1
Skeemid Skeemid koosnevad juhtmetest ja komponentidest Läbi juhtmete voolavad etteantud tüüpi väärtused Komponendid omavad sisend- ja väljundjuhtmeid input a output Kommunikatsioon on sünkroone a b = a b VARMO VENE 2
Skeemid Skeemide konstrueerimine pure unctions composition bypass eedback primitive components VARMO VENE 3
Nooled class Arrow a where pure :: (b -> c) -> a b c b c (>>>) :: a b c -> a c d -> a b d b c g d irst :: a b c -> a (b,d) (c,d) b d c d VARMO VENE 4
Noolte aksioomid pure id >>> = = >>> pure id = = ( >>> g) >>> h = >>> (g >>> h) g h pure (g. ) = pure >>> pure g g VARMO VENE 5
Noolte aksioomid irst (pure ) = pure ( * id) where * g = \(x,y) -> ( x, g y) irst ( >>> g) = irst >>> irst g g irst >>> pure (id * g) = pure (id * g) >>> irst g = g VARMO VENE 6
Noolte aksioomid irst >>> pure st = pure st >>> = irst (irst ) >>> pure assoc = pure assoc >>> irst where assoc ((x,y),z) = (x,(y,z)) VARMO VENE 7
Noolte kombinaatoreid arr :: Arrow a => (b -> c) -> a b c arr = pure returna :: Arrow a => a b b returna = arr id second :: Arrow a => a b c -> a (d,b) (d,c) second = arr swap >>> irst >>> arr swap where swap ~(x,y) = (y,x) d b d c VARMO VENE 8
Noolte kombinaatoreid (***) :: Arrow a => a b c -> a b c -> a (b,b ) (c,c ) *** g = irst >>> second g b b c g c (&&&) :: Arrow a => a b c -> a b d -> a b (c,d) &&& g = arr (\b -> (b,b)) >>> *** g b g c d VARMO VENE 9
Tsüklitega nooled class Arrow a => ArrowLoop a where loop :: a (b,d) (c,d) -> a b c b d c VARMO VENE 10
Konkreetseid nooli Funktsioonid instance Arrow (->) where arr = >>> g = g. irst = \ ~(x,y) -> ( x, y) trace :: ((b,d) -> (c,d)) -> b -> c trace b = let (c,d) = (b,d) in c instance ArrowLoop (->) where loop = trace VARMO VENE 11
Konkreetseid nooli Olekuteisendajad newtype State s i o = ST ((s,i) -> (s,o)) instance Arrow (State s) where pure = ST (id * ) ST >>> ST g = ST (g. ) irst (ST ) = ST (assoc. ( * id). unassoc) instance ArrowLoop (->) where loop (ST ) = ST (trace (unassoc.. assoc)) VARMO VENE 12
Konkreetseid nooli Monaadid newtype Kleisli m a b = Kleisli (a -> m b) instance Monad m => Arrow (Kleisli m) where arr = Kleisli (return. ) Kleisli >>> Kleisli g = Kleisli (\b -> b >>= g) irst (Kleisli ) = Kleisli (\ ~(b,d) -> b >>= \c -> return (c,d)) instance MonadFix m => ArrowLoop (Kleisli m) where loop (Kleisli ) = Kleisli (litm st. mix. ) where x y = (x, snd y) VARMO VENE 13
Konkreetseid nooli Monaadid newtype Kleisli m a b = Kleisli (a -> m b) instance Monad m => Arrow (Kleisli m) where arr = Kleisli (return. ) Kleisli >>> Kleisli g = Kleisli (\b -> b >>= g) irst (Kleisli ) = Kleisli (\ ~(b,d) -> b >>= \c -> return (c,d)) instance MonadFix m => ArrowLoop (Kleisli m) where loop (Kleisli ) = Kleisli (litm st. mix. ) where x y = (x, snd y) VARMO VENE 14
Konkreetseid nooli Striimprotsessorid data Stream a = Cons a (Stream a) zipstr :: (Stream a, Stream b) -> Stream (a,b) zipstr (Cons x xs, Cons y ys) = Cons (x,y) (zipstr (xs,ys)) unzipstr :: Stream (a,b) -> (Stream a, Stream b) unzipstr (Cons (x,y) xys) = (Cons x xs, Cons y ys) where (xs,ys) = unzipstr xys instance Functor Stream where map (Cons x xs) = Cons ( x) (map xs) VARMO VENE 15
Konkreetseid nooli Striimprotsessorid (järg) newtype StrProc b c = SP (Stream b -> Stream c) instance Arrow StrProc where pure = SP (map ) SP >>> SP g = SP (g. ) irst (SP ) = SP (zipstr. ( * id). unzipstr) instance ArrowLoop StrProc where loop (SP ) = SP (loop (unzipstr.. zipstr)) VARMO VENE 16
Konkreetseid nooli Viivitusega nooled class ArrowLoop a => ArrowCircuit a where delay :: b -> a b b instance ArrowCircuit StrProc where delay b = SP (Cons b) VARMO VENE 17
Konkreetseid nooli Näide: alglaetav londur reset const 0 i output next +1 delay 0 counter :: ArrowCircuit a => a Bool Int counter = loop (pure cond >>> pure dup >>> second (pure (+1) >>> delay 0)) where cond (reset,next) = i reset then 0 else next dup x = (x,x) VARMO VENE 18
Konkreetseid nooli Automaadid newtype Auto i o = A (i -> (o,auto i o)) instance Arrow Auto where pure = A (\b -> ( b, pure )) A >>> A g = A (\b -> let (c, ) = b (d,g ) = g c in (d, >>> g )) irst (A ) = A (\(b,d) -> let (c, ) = b in ((c,d), irst )) instance ArrowLoop Auto where loop (A ) = A (\b -> let (~(c,d), ) = (b,d) in (c, loop )) instance ArrowCircuit Auto where delay b = A (\b -> (b, delay b )) VARMO VENE 19
Noolte notatsioon Noolte süntaks exp =... proc pat-> cmd cmd = exp-< exp do { stmt;... ; stmt; cmd } stmt = pat <- cmd cmd rec { stmt;... ; stmt } VARMO VENE 20
Noolte notatsioon Transleerimisreeglid proc p-> -< a = pure(λp a)>>> i FV(p) FV( ) = pure(λp (, a))>>>app otherwise proc p-> do { c } = proc p-> c proc p-> do { p <- c; B } = ((proc p-> c)&&&returna)>>> proc (p, p)-> do { B } proc p-> do { c; B } = proc p-> do {_<- c; B } proc p-> do { rec { A }; B } = returna&&&loop(proc (p, p A )-> do { A;returnA-< (p B, p A )})>>> proc (p, p B )-> do { B } VARMO VENE 21
Alglaetav londur reset const 0 i output next +1 delay 0 counter :: ArrowCircuit a => a Bool Int counter = proc reset -> do rec output <- returna -< i reset then 0 else next next <- delay 0 -< output + 1 returna -< output VARMO VENE 22