Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en...

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

Transcript of Hogere-ordefuncties nEen lijst langs lopen en met elk element iets doen nEen lijst langs lopen en...

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!