30
Polymorf zoeken zoek :: (aaBool) [ (a, b) ] a zoek eq [ ] x = ??? zoek eq ((a,b):ts) x | eq a x = b | otherwise = zoek eq t MayBe b No Yes b

Polymorf zoeken

  • Upload
    lalo

  • View
    46

  • Download
    0

Embed Size (px)

DESCRIPTION

Polymorf zoeken. zoek :: (aaBool)  [ (a, b) ]  a  b. MayBe b. No. zoek eq [ ] x = ??? zoek eq ((a,b):ts) x | eq a x = b | otherwise = zoek eq ts x. Yes b. Zelftest. zipWith. - PowerPoint PPT Presentation

Citation preview

Page 1: Polymorf zoeken

Polymorf zoeken

zoek :: (aaBool) [ (a, b) ] a b

zoek eq [ ] x = ???zoek eq ((a,b):ts) x | eq a x = b | otherwise = zoek eq ts x

MayBe b

No

Yes b

Page 2: Polymorf zoeken

Zelftest

Schrijf de functie (definitie en type) die overeenkomstige elementen van twee lijsten koppelt

> zipWith (+) [1, 2, 3] [4, 5, 6, 7][5, 7, 9]

met een nader tespecificeren operator

zipWith

Page 3: Polymorf zoeken

Lijst-comprehensies

Notatie uit de verzamelingenleer

{ x*x | x N, x<10 }

> [ x*x | x [1..10], even x ][4, 16, 36, 64, 100]

> [ (x,y) | x [1,4,8], y ”ab” ][ (1,’a’), (1,’b’), (4,’a’), (4,’b’), (8,’a’), (8,’b’) ]

Page 4: Polymorf zoeken

Zelf datastructuren ontwerpen

data Boom a = Blad | Tak a (Boom a) (Boom a)

constructorfuncties

het nieuwetype

types van de parameters van de constructorfuncties

Blad:: Boom aTak :: a Boom a

Boom a Boom a

Page 5: Polymorf zoeken

Functies op datastructuren

Lijst

Boom

length :: [a] Intlength [ ] = 0length (x:xs) = 1 + length xs

omvang :: Boom a Intomvang Blad = 0omvang Tak x li re

= 1 + omvang li + omvang reconstructor

functies

Page 6: Polymorf zoeken

Insert in een zoekboom

insert :: (aaOrd) a Boom a Boom a

insert cmp e Blad = insert cmp e (Tak x li re) =

Tak e Blad Bladcmp e xf ( )

where f LT =f _ =

Tak x (insert cmp e li) reTak x li (insert cmp e re)

Page 7: Polymorf zoeken

Toepassing: Breuken

type Breuk = (Int, Int)3

4

maal :: Breuk Breuk Breukplus :: Breuk Breuk Breukeq :: Breuk Breuk Booleenvoud :: Breuk Breuk

3

4

6

5

1

2

2

4

Page 8: Polymorf zoeken

Breuken vermenigvuldigen

Teller en noemervermenigvuldigen

3

4

6

5*

18

20=

maal :: Breuk Breuk Breukmaal (x,y) (p,q) = (x*p, y*q)

Page 9: Polymorf zoeken

Breuken optellen

Eerst gelijknamig maken

1

4

3

10+

22

40=

plus :: Breuk Breuk Breukplus (x,y) (p,q) = (x*q+y*p, y*q)

10

40

12

40+ =

Page 10: Polymorf zoeken

Breuken vergelijken

Kruiselings vermenigvuldigen

2

8

3

12= = True

eq :: Breuk Breuk Boolmaal (x,y) (p,q) = x*q == y*p

Page 11: Polymorf zoeken

Toepassing: Polynomen

type Term = (Float, Int)type Poly = [Term]

3.5x4 + 6.1x2 + 2.5

maal :: Poly Poly Polyplus :: Poly Poly Polyeq :: Poly Poly Booleenvoud :: Poly Poly

Page 12: Polymorf zoeken

Polynomen optellen

Samenvoegen envereenvoudigen

+ =

plus :: Poly Poly Polyplus p q = eenvoud (p ++ q)

3x4 + 4x2 2x2 + 1 3x4 + 4x2 + 2x2 + 1

3x4 + 6x2 + 1

Page 13: Polymorf zoeken

Polynomen vereenvoudigen

Sorteren op exponenttermen met gelijke exponent samenvoegen

=

eenvoud :: Poly Poly eenvoud =

3x4 + 4x2 +2x3 + x2+ 1 3x4 + 5x2 + 2x3 + 1

sorterensamenvoegen .verw0 .

Page 14: Polymorf zoeken

Polynomen vereenvoudigen

eenvoud :: Poly Poly eenvoud = verw0 . samen . sorteren

sorteren = isort ordwhere ord :: Term Term Ordering

ord (c1,e1) (c2,e2) = ordInt e1 e2samen ((c1,e1):(c2,e2):ts) | e1==e2 = samen ((c1+c2,e1):ts)| True = (c1,e1) : samen ((c2,e2):ts)samenv ts = tsverw0 = filter ( \(c,e) c/=.0.0 )

Page 15: Polymorf zoeken

Polynomen vermenigvuldigen

Alle termen met elkaar vermenigvuldigen

* =

maal :: Poly Poly Polymaal p q = eenvoud (cross tMaal p q)

3x + 1 2x2 + 5 6x3+15x + 2x2+5

tMaal :: Term Term TermtMaal (c1,e1) (c2,e2) = (c1*.c2, e1+e2)

Page 16: Polymorf zoeken

Kruisproduct

Met lijstcomprehensie

Met expliciete recursie

cross :: (aab) [a] [a] [b]cross f xs ys = [ f x y | x xs, yys ]

cross f [ ] ys =cross f (x:xs) ys =

[ ]map (f x) ys++cross f xs ys

Page 17: Polymorf zoeken

Ontwerp van functiesop lijsten

Combineer standaardfuncties

Herken je een , , of zoiets?Schrijf dan eerst de hulpfunctie

Gebruik expliciete recursie

map filter foldr

f [ ] = ...f (x:xs) = ... f xs ...

Page 18: Polymorf zoeken

Voorbeeld 1

Een string afpassen op een gegeven lengte

afkappen, ofaanvullen met spaties

precies :: Int String Stringprecies n s | n < len = | n == len = | n > len =where len = length s

take n sss ++ replicate (n-len) ’_’

Page 19: Polymorf zoeken

Voorbeeld 2

Een heleboel strings afpassen op lengte

> evenlang 4 [ ”aap”, ”noot”, ”weide” ][ ”aap_”, ”noot”, ”weid” ]

evenlang :: Int [String] [String]evenlang n xs = map f xs

where f x = precies n x

evenlang n xs = map (precies n) xs

Page 20: Polymorf zoeken

Voorbeeld 3

Strings even lang maken zonder afkappen

> uniform [ ”aap”, ”noot”, ”weide” ][ ”aap__”, ”noot_”, ”weide” ]

uniform :: [String] [String]uniform xs = evenlang n xs where n = maximum (map length xs)

Page 21: Polymorf zoeken

Voorbeeld 4

Kolommen afpassen in blok van strings

> unikol [ [ ”aap”, ”noot”, ”mies” ] , [ ”wim”, ”zus”, ”jet” ] , [ ”weide”,”hok”, ”schapen”] ]

[ [ ”aap__”, ”noot”, ”mies___” ] ,[ ”wim__”, ”zus_”, ”jet____” ] ,[ ”weide”, ”hok_”, ”schapen” ] ]

Page 22: Polymorf zoeken

Kolommen uniformeren

jetzuswim

miesnootaap

schapenhokweide

unikol xss = map uniform xss

Page 23: Polymorf zoeken

Kolommen uniformeren

jetzuswim

miesnootaap

schapenhokweide

unikol xss = map uniform xss

Page 24: Polymorf zoeken

Kolommen uniformeren

jetzuswim

miesnootaap

schapenhokweide

unikol =

Page 25: Polymorf zoeken

Kolommen uniformeren

jetzuswim

miesnootaap

schapenhokweide

unikol = wissel

Page 26: Polymorf zoeken

Kolommen uniformeren

jetzuswim

miesnootaap

schapenhokweide

unikol = map uniform . wissel

Page 27: Polymorf zoeken

Kolommen uniformeren

jetzuswim

miesnootaap

schapenhokweide

unikol = wissel . map uniform . wissel

Page 28: Polymorf zoeken

Wissel

[1, 2] [3, 4] [5, 6] [7, 8]

[1, 3, 5, 7] [2, 4, 6, 8]

[3, 5, 7] [4, 6, 8][1, 2]

wissel ( xs : xss )

= (wissel xss)xs

zipWith (:)

Page 29: Polymorf zoeken

Wissel

wissel (xs : xss) = zipWith (:) xs (wissel xss)wissel [ ] =

3 rijen van elk 5 elementen 5 rijen van elk 3 elementen2 rijen van elk 5 elementen 5 rijen van elk 2 elementen1 rij van elk 5 elementen 5 rijen van elk 1 element

0 rijen van elk 5 elementen 5 rijen van elk 0 elementenveel veel

oneindig

repeat [ ]

wissel = foldr ... ...

Page 30: Polymorf zoeken

Aanloop

1 2 3 4

1

aanloop ( x : xs )

= (aanloop xs)xmap ((:) )

[ ] [1,2,3,4][1,2,3][1,2][1]

[ ] [2,3,4][2,3][2]

[ ] :

:: [a] [[a]]