17
Hogere-ordefuncties Een lijst langs lopen en met elk element iets doen Een lijst langs lopen en sommige elementen selecteren map filter

Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Embed Size (px)

Citation preview

Page 1: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Hogere-ordefuncties

Een lijst langs lopenen met elk element iets doen

Een lijst langs lopenen sommige elementen selecteren

map

filter

Page 2: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

map en filter

> map even [1, 2, 3, 4, 5, 6][False, True, False, True, False,

True]

> filter even [1, 2, 3, 4, 5, 6][2, 4, 6]

doe dit overal

neem alleen wie hieraan voldoet

Page 3: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Definitie van map

Geef een recursieve definitie:

map :: (ab) [a] [b]

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

[ ]map f xs

f x

:

Page 4: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Definitie van filter

Geef een recursieve definitie,en gebruik guards voor gevalsonderscheid

filter :: (aBool) [a] [a] filter p [ ] =filter p (x:xs) =

[ ]x : filter p xs| p x

| True = filter p xs

Page 5: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Een ander soort lijst-functies

product :: [Int] Int product [ ] =product (x:xs)

=

1product xsx *

and :: [Bool] Bool and [ ] =and (x:xs)=

Trueand xsx

&&sum :: [Int] Int sum [ ] =sum (x:xs)

=

0sum xsx +

Page 6: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Universele “lijst-totalisator”

foldr :: [a] a

foldr (#) e [ ] =foldr (#) e (x:xs)=

efoldr (#) e xsx #

(aaa) a

zo combineren neutrale waarde

Page 7: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Had dat eerder gezegd...

Als foldr de generalisatie isvan sum, product, en and ....

.... dan zijn sum, product, en andspeciale gevallen van foldr

product = foldr (*) 1and = foldr (&&) Truesum = foldr (+) 0or = foldr (||) False

Page 8: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Hoger-ordefuncties op lijsten

Doorloop een lijst en ...

map :: (ab) [a] [b]

filter :: (aBool) [a] [a]

foldr :: (aaa) a [a] a

[a]

[a]

[a]

doe dit

pak deze

combineer zo

begin hiermee

Page 9: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Hoger-ordefuncties op lijsten

Doorloop een lijst en ...

map :: (ab) [a] [b]

filter :: (aBool) [a] [a]

foldr :: (abb) b [a] b

[a]

[a]

[a]

doe dit

pak deze

combineer zo

begin hiermee

Page 10: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Andere hogere-ordefuncties

until :: (aBool) (aa) a a

begin hiermeedoe dit

totdat dit geldt

> until (>1000) (*2) 11024

until p f x =| p x | True =

x(f x)until p f

Page 11: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Andere hogere-ordefuncties

(.) ::

begin hiermee

doe diten dan dat

> map (not . even) [1, 2, 3, 4, 5, 6]

[1, 3, 5]

(.) g f x =

g (f x)

a(ab)(bc) c(a c)

Page 12: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Partieel parametriseren

> map (plus 5) [1 .. 5][6, 7, 8, 9, 10]

> until (>1000) (*2) 11024

> filter (not . even) [1 .. 5][1, 3, 5]

Page 13: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Partieel parametriseren

> map f [1 .. 4]where f x = x*x + 3*x + 2

[6, 12, 20, 30]

> map f [1 .. 4]

[6, 12, 20, 30]

( \ x x*x+3*x+2 )

Page 14: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Lambda-expressies

x*x + 3*x + 2

expressie waarx vrij in voorkomt

\ x

de functie die dieexpressie uitrekent

Page 15: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Lambda ?

x . x*x + 3*x + 2

x . x*x + 3*x + 2

x . x*x + 3*x + 2

x . x*x + 3*x + 2

(LAMBDA x)( x*x + 3*x + 2 )

\ x x*x + 3*x + 2

\ x -> x*x + 3*x + 2

Page 16: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Hoger-ordefuncties op lijsten

Doorloop een lijst en ...

map :: (ab) [a] [b]

filter :: (aBool) [a] [a]

foldr :: (abb) b [a] b

[a]

[a]

[a]

doe dit

pak deze

combineer zo

Page 17: Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en sommige elementen selecteren map filter

Currying

Type

Aanroep

f :: Int Bool String

> f 7 True“hoi”

f 7

Bool String

rechts-associatief

links-associatief

zonder haakjes!