De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

eval (Add x y) = add (eval x) (eval y)

Verwante presentaties


Presentatie over: "eval (Add x y) = add (eval x) (eval y)"— Transcript van de presentatie:

1 eval (Add x y) = add (eval x) (eval y)
Compositionaliteit Een semantiek is compositioneel als de betekenis van een geheel een functie is van de betekenissen van de delen eval (Add x y) = add (eval x) (eval y) Een compositionele semantiek kun je schrijven als fold over de expressie waarbij een algebra vervangingen geeft voor de constructoren

2 Zelfgemaakt datatype voor bomen
data Tree a = Bin (Tree a) (Tree a) | Leaf a Met functies foldTree :: (bbb , ab)Tree a  b foldTree (b,lf) = f where f (Bin le ri) = b (f le) (f ri) f (Leaf x) = lf x foldTree :: Tree a  b foldTree (b,lf) (Bin le ri) = b (foldTree (b,lf) le) (foldTree (b,lf) ri) foldTree (b,lf) (Leaf x) = lf x ( , ) bbb ab

3 Functies op bomen foldTree :: ( bbb , ab )  Tree a  b
Specialisaties: countLeafs :: Tree a  Int countLeafs = foldTree ( (+) , \x1 ) sumLeafs :: Tree Int  Int sumLeafs = foldTree ( (+) , \xx ) listLeafs :: Tree a  [a] listLeafs = foldTree ( (++) , \x[x] )

4 De essentie van Tree-functies
type TreeAlgebra a b = ( bbb , ab ) countLeafsFuns :: ( IntIntInt , aInt ) countLeafsFuns :: TreeAlgebra a Int countLeafsFuns = ( (+) , \x1 ) countLeafs :: Tree a  Int countLeafs = foldTree ( (+) , \x1 ) countLeafs :: Tree a  Int countLeafs = foldTree countLeafsFuns

5 Tree, TreeAlgebra en functie foldTree
data Tree a = Bin (Tree a) (Tree a) | Leaf a type TreeAlgebra a b = ( bbb , ab ) foldTree :: TreeAlgebra a bTree a  b foldTree (b,lf) = f where f (Bin le ri) = b (f le) (f ri) f (Leaf x) = lf x

6 Voorbeelden van TreeAlgebra
type TreeAlgebra a b = ( bbb , ab ) countLeafsFuns :: TreeAlgebra a Int countLeafsFuns = ( (+) , \x1 ) sumLeafsFuns :: TreeAlgebra Int Int sumLeafsFuns = ( (+) , \xx ) listLeafsFuns :: TreeAlgebra a [a] listLeafsFuns = ( (++) , \x[x] )

7 Hoofdstuk 8: eenvoudige niet-polymorfe versie
data Tree = Leaf Int | Bin Tree Tree type TreeAlgebra b = (Intb , bbb) foldTree :: TreeAlgebra bTree  b foldTree (b,lf) = f where f (Leaf x) = lf x f (Bin le ri) = b (f le) (f ri)

8 Publieksvraag Maak een algebra die het minimum van een Tree bepaalt
Maak een algebra die alle bladeren van een Tree vervangt door 0 (geef ook de types aan) data Tree = Leaf Int | Bin Tree Tree

9 Repmin, versie 1 repmin t = b where b = fold subalg t
m = fold minalg t “pass 2” “pass 1” minalg :: Algebra Int minalg = ( \x  x , \m1 m2  min m1 m ) subalg :: Algebra Tree subalg = ( \x  Leaf 0 , \b1 b2  Bin b1 b ) m

10 weg met deze globale variabele!
Repmin, versie 12 repmin t = b where b = fold subalg t m = fold minalg t minalg :: Algebra Int minalg = ( \x  x , \m1 m2  min m1 m ) subalg :: Algebra Tree subalg = ( \x  Leaf m , \b1 b2  Bin b1 b ) weg met deze globale variabele!

11 Repmin, versie 1  2 repmin t = r m where r = fold repalg t
m = fold minalg t repmin t = b where b = fold subalg t m = fold minalg t minalg :: Algebra Int minalg = ( \x  x , \m1 m2  min m1 m ) repalg :: Algebra (Int  Tree) repalg = ( \x  \m  Leaf m , \r1 r2  \m  Bin (r1 m) (r2 m)) repalg :: Algebra (Int  Tree) repalg = ( \x  Leaf m , \b1 b2  Bin b1 b ) repalg :: Algebra (Int  Tree) repalg = ( \x  \m  Leaf m , \b1 b2  \m  Bin b1 b2 )

12 Passes zijn nu onafhankelijk van elkaar!
Repmin, versie 2 repmin t = r m where r = fold repalg t m = fold minalg t Passes zijn nu onafhankelijk van elkaar! minalg :: Algebra Int minalg = ( \x  x , \m1 m2  min m1 m ) repalg :: Algebra (Int  Tree) repalg = ( \x  \m  Leaf m , \r1 r2  \m  Bin (r1 m) (r2 m))

13 één gecombineerde pass met tupelresultaat
Repmin, versie 2  3 repmin t = r m where (m,r)= fold tupalg t één gecombineerde pass met tupelresultaat tupalg :: Algebra ( Int , Int  Tree ) tupalg = ( \x  ( x , \m  Leaf m ) , \t1 t2  ( min m1 m2 , \m  Bin (r1 m) (r2 m) ) ) tupalg :: Algebra ( Int , Int  Tree ) tupalg = ( \x  ( x , \m  Leaf m ) , \t1 t2  let (m1,r1) = t1 (m2,r2) = t2 in ( min m1 m2 , \m  Bin (r1 m) (r2 m) ) ) tupalg :: Algebra ( Int , Int  Tree ) tupalg = ( \x  ( x , \m  Leaf m ) , \t1 t2  ) tupalg :: Algebra ( Int , Int  Tree ) tupalg = ( \x  , \t1 t2  ) minalg :: Algebra Int minalg = ( \x  x , \m1 m2  min m1 m ) repalg :: Algebra (Int  Tree) repalg = ( \x  \m  Leaf m , \r1 r2  \m  Bin (r1 m) (r2 m))

14 Repmin, versie 3 repmin t = r m where (m,r)= fold tupalg t
Int  (Int,Tree) tupalg :: Algebra ( Int , Int  Tree ) tupalg = ( \x  ( x , \m  Leaf m ) , \t1 t2  let (m1,r1) = t1 (m2,r2) = t2 in ( min m1 m2 , \m  Bin (r1 m) (r2 m) ) ) tupalg :: Algebra ( Int , Int  Tree ) tupalg = ( \x  ( x , \m  Leaf m ) , \t1 t2  let (m1,r1) = t1 (m2,r2) = t2 in ( min m1 m2 , \m  Bin (r1 m) (r2 m) ) )

15 Repmin, versie 3  4 repmin t = where f = fold meralg t repmin t = b
(m,b) = f m repmin t = r m where (m,r)= fold tupalg t meralg :: Algebra (Int  (Int,Tree)) meralg = ( \x  \m  ( x , Leaf m ) , \f1 f2 \m let (m1,b1) = f1 m (m2,b2) = f2 m in ( min m1 m2 , Bin b1 b2 ) ) meralg :: Algebra (Int  (Int,Tree)) meralg = ( \x  \m  ( x , Leaf m ) , \f1 f2 \m  ( min m1 m2 , Bin b1 b2 ) ) meralg :: Algebra (Int  (Int,Tree)) meralg = ( \x  \m  , \f1 f2 \m  ) meralg :: Algebra (Int  (Int,Tree)) meralg = ( \x  , \f1 f2  ) meralg :: Algebra (Int  (Int,Tree)) meralg = ( \x  \m  ( x , Leaf m ) , \f1 f2 \m  )


Download ppt "eval (Add x y) = add (eval x) (eval y)"

Verwante presentaties


Ads door Google