• Keine Ergebnisse gefunden

Vorlesung vom 24.11.2010: Funktionen Höherer Ordnung

N/A
N/A
Protected

Academic year: 2022

Aktie "Vorlesung vom 24.11.2010: Funktionen Höherer Ordnung"

Copied!
4
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

Praktische Informatik 3: Einführung in die Funktionale Programmierung

Vorlesung vom 24.11.2010: Funktionen Höherer Ordnung

Christoph Lüth & Dennis Walter Universität Bremen Wintersemester 2010/11

Rev. 1204 1 [29]

Fahrplan

I Teil I: Funktionale Programmierung im Kleinen

IEinführung

IFunktionen und Datentypen

IRekursive Datentypen

ITypvariablen und Polymorphie

IFunktionen höherer Ordnung

ITypinferenz

I Teil II: Funktionale Programmierung im Großen I Teil III: Funktionale Programmierung im richtigen Leben

2 [29]

Inhalt

IFunktionenhöherer Ordnung

IFunktionen alsgleichberechtigte Objekte

IFunktionen alsArgumente

ISpezielle Funktionen:map,filter,foldund Freunde Ifoldrvsfoldl

3 [29]

Funktionen als Werte

I Argumente können auchFunktionensein.

I Beispiel: Funktionzweimalanwenden t w i c e :: (α→ α)α→ α t w i c e f x = f ( f x ) I Auswertung wie vorher:

twice inc 3 5 twice (twice inc ) 3 7

I Beispiel: Funktionn-mal hintereinanderanwenden:

i t e r :: I n t→ (α→ α)α→ α i t e r 0 f x = x

i t e r n f x | n> 0 = f ( i t e r ( n−1) f x )

| o t h e r w i s e = x I Auswertung:

iter 3 inc 6

4 [29]

Funktionen Höherer Ordnung

Slogan

“Functions are first-class citizens.”

IFunktionen sindgleichberechtigt: Werte wiealle anderen

IGrundprinzipder funktionalen Programmierung

IReflektion

IFunktionenalsArgumente

5 [29]

Funktionen als Argumente: Funktionskomposition

I Funktionskomposition(mathematisch)

(◦) :: (β→ γ) → (α→ β)→ α→ γ

( f ◦g ) x = f ( g x )

IVordefiniert

ILies:fnachg

I Funktionskompositionvorwärts:

(>.>) :: (α→ β)→ (β→ γ)α→ γ ( f >.> g ) x =g ( f x )

INichtvordefiniert!

6 [29]

Funktionen als Argumente: Funktionskomposition

IVertauschen derArgumente(vordefiniert):

f l i p :: (α→ βγ)→ β→ α→ γ

f l i p f b a= f a b

IDamit Funktionskomposition vorwärts:

(>.>) :: (α→ β)→ (β→ γ)→ α→ γ (>.>) f g x = f l i p (◦) f g x

IOperatorennotation

7 [29]

η-Kontraktion

I Alternative Definition der Vorwärtskomposition:PunktfreieNotation (>.>) :: (α→ β)→ (β→ γ)α→ γ

(>.>) = f l i p (◦) I Da fehlt doch was?! Nein:

(>.>)=flip (◦) ≡ (>.>) f g a=flip (◦) f g a

I η-Kontraktion (η-Äquivalenz)

IBedingung:E::α→β,x :: α,Edarfxnicht enthalten λx→E x ≡ E

ISyntaktischer SpezialfallFunktionsdefinition:

f x=E x ≡ f =E

I Warum?ExtensionaleGleichheit von Funktionen

8 [29]

(2)

Funktionen als Argumente: map

IFunktionauf alle Elemente anwenden:map ISignatur:

map :: (α→ β)→ [α]→ [β] IDefinition

map f [ ] = [ ]

map f ( x : x s ) = f x : map f x s IBeispiel:

t o L :: S t r i n g→ S t r i n g t o L = map t o L o w e r

9 [29]

Funktionen als Argumente: filter

I Elementefiltern:filter I Signatur:

f i l t e r :: (α→ B o o l )→ [α]→ [α]

I Definition

f i l t e r p [ ] = [ ] f i l t e r p ( x : x s )

| p x = x : f i l t e r p x s

| o t h e r w i s e = f i l t e r p x s I Beispiel:

l e t t e r s :: S t r i n g→ S t r i n g l e t t e r s = f i l t e r i s A l p h a

10 [29]

Beispiel: Primzahlen

ISieb des Erathostenes

IFür jedegefundene PrimzahlpalleVielfachenheraussieben

IDazu:filternmit\n→mod n p/=0!

INamenlose(anonyme) Funktion IPrimzahlen im Intervall[1.. n]:

s i e v e :: [ I n t e g e r ]→ [ I n t e g e r ] s i e v e [ ] = [ ]

s i e v e ( p : p s ) =

p : s i e v e ( f i l t e r ( \n→ mod n p /= 0 ) p s ) p r i m e s :: I n t e g e r→ [ I n t e g e r ]

p r i m e s n= s i e v e [ 2 . . n ]

INB: Mit2anfangen!

IListengenerator[n.. m]

11 [29]

Partielle Applikation

I Funktionskonstruktorrechtsassoziativ:

a→b→c≡a→(b→c)

IInbesondere:(a→b)→c6=a→(b→c) I Funktionsanwendung istlinksassoziativ:

f a b≡( f a) b I Inbesondere:f (a b)6=( f a) b

I PartielleAnwendung von Funktionen:

IFürf :: a→b→c,x :: aistf x :: b→c(closure) I Beispiele:

Imap toLower::String→String

I (3==)::Int→Bool

Iconcat◦map ( replicate 2) :: String→String

12 [29]

Einfache Rekursion

IEinfache Rekursion: gegeben durch

Ieine Gleichungfür dieleere Liste

Ieine Gleichungfür dienicht-leere Liste

IBeispiel:sum,concat,length,(++), . . . IAuswertung:

sum [4,7,3] 4 + 7 + 3 + 0

concat [A, B, C] A ++ B ++ C++ []

length [4, 5, 6] 1+ 1+ 1+ 0

13 [29]

Einfache Rekursion

I Allgemeines Muster:

f [] = A

f (x:xs) = x⊗f xs I Parameterder Definition:

IStartwert (für die leere Liste)A::b

IRekursionsfunktion⊗:: a -> b-> b I Auswertung:

f [x1,..., xn]=x1⊗x2⊗. . .⊗xn⊗A I Terminiertimmer

I Entspricht einfacherIteration(while-Schleife)

14 [29]

Einfach Rekursion durch foldr

IEinfacheRekursion

IBasisfall: leere Liste

IRekursionsfall: Kombination aus Listenkopf und Rekursionswert

ISignatur

f o l d r :: (α→ ββ)→ β→ [α]β IDefinition

f o l d r f e [ ] = e

f o l d r f e ( x : x s ) = f x ( f o l d r f e x s )

15 [29]

Beispiele: foldr

I Summierenvon Listenelementen.

sum :: [ I n t ]→ I n t sum x s = f o l d r (+) 0 x s I Flachklopfenvon Listen.

c o n c a t :: [ [ a ] ]→ [ a ] c o n c a t x s = f o l d r (++) [ ] x s I Längeeiner Liste

l e n g t h :: [ a ]→ I n t

l e n g t h x s = f o l d r (λx n→ n+ 1 ) 0 x s

16 [29]

(3)

Noch ein Beispiel: rev

IListenumdrehen:

r e v :: [ a ]→ [ a ]

r e v [ ] = [ ]

r e v ( x : x s ) = r e v x s ++ [ x ] IMitfold:

r e v x s = f o l d r s n o c [ ] x s s n o c :: a→ [ a ]→ [ a ] s n o c x x s = x s ++ [ x ] IUnbefriedigend: doppelte Rekursion

17 [29]

Einfache Rekursion durch foldl

I foldrfaltet vonrechts:

foldr⊗[x1, ...,xn]A=x1⊗(x2⊗(. . .(xn⊗A))) I Warum nichtandersherum?

foldl⊗[x1, ...,xn]A= (((A⊗x1)⊗x2). . .)⊗xn I Definition vonfoldl:

f o l d l :: (α → βα)α → [β] → α

f o l d l f a [ ] = a

f o l d l f a ( x : x s ) = f o l d l f ( f a x ) x s

18 [29]

Beispiel: rev revisited

IListenumkehr ist faltenvon links:

r e v ’ x s = f o l d l ( f l i p ( : ) ) [ ] x s

INur nocheineRekursion

19 [29]

foldr vs. foldl

I f=foldr⊗Aentspricht

f [] = A

f (x:xs) = x⊗f xs

IKann nicht-strikt inxssein, z.B.and,or I f=foldl⊗Aentspricht

f xs = g A xs

g a [] = a

g a (x:xs) = g(a⊗x)xs

IEndrekursiv(effizient), aber strikt inxs

20 [29]

foldl = foldr

Definition (Monoid) (⊗,A)ist einMonoidwenn

A⊗x=x (Neutrales Element links) x⊗A=x (Neutrales Element rechts) (x⊗y)⊗z=x⊗(y⊗z) (Assoziativät) Theorem

Wenn(⊗,A)Monoid, dann für alleA,xs foldlAxs=foldrAxs

IBeispiele:length,concat,sum IGegenbeispiel:rev

21 [29]

Funktionen Höherer Ordnung: Java

I Java: keine direkte Syntax für Funktionen höherer Ordnung I Folgendes istnichtmöglich:

i n t e r f a c e C o l l e c t i o n {

O b j e c t f o l d ( O b j e c t f ( O b j e c t a , C o l l e c t i o n c ) , O b j e c t a ) }

I Aber folgendes:

i n t e r f a c e F o l d a b l e { O b j e c t f ( O b j e c t a ) ; } i n t e r f a c e C o l l e c t i o n {

O b j e c t f o l d ( F o l d a b l e f , O b j e c t a ) ; } I VergleicheIteratoraus Collections Framework (Java SE 6):

p u b l i c i n t e r f a c e I t e r a t o r<E>

b o o l e a n h a s N e x t ( ) ; E n e x t ( ) ; }

22 [29]

Funktionen Höherer Ordnung: C

IImplizitvorhanden: Funktionen = Zeiger auf Funktionen t y p e d e f s t r u c t l i s t _ t {

v o i d ∗e l e m ;

s t r u c t l i s t _ t ∗n e x t ; } ∗l i s t ;

l i s t f i l t e r (i n t f (v o i d ∗x ) , l i s t l ) ; IKeinedirekteSyntax (e.g. namenlose Funktionen) ITypsystem zuschwach(keine Polymorphie) IBenutzung:signal(C-Standard 7.14.1)

#i n c l u d e <s i g n a l . h>

v o i d (∗s i g n a l (i n t s i g , v o i d (∗f u n c ) (i n t) ) ) (i n t) ;

23 [29]

Funktionen Höherer Ordnung: C

Implementierung vonfilter:

l i s t f i l t e r (i n t f (v o i d ∗x ) , l i s t l ) { i f ( l == NULL ) {

r e t u r n NULL ; }

e l s e { l i s t r ;

r= f i l t e r ( f , l→ n e x t ) ; i f ( f ( l→ e l e m ) ) {

l→n e x t= r ; r e t u r n l ; }

e l s e { f r e e ( l ) ; r e t u r n r ;

} } }

24 [29]

(4)

Übersicht: vordefinierte Funktionen auf Listen II

map :: (α→ β)→ [α]→ [β] −−Auf alle anwenden f i l t e r :: (α→ B o o l )→ [α]→ [α] −−Elemente filtern f o l d r :: (α→ ββ)→ β→ [α]β −−Falten v. rechts f o l d l :: (β→ α→ β)→ β→ [α]β −−Falten v. links t a k e W h i l e :: (α→ B o o l )→ [α]→ [α]

d r o p W h i l e :: (α→ B o o l )→ [α]→ [α]

−−takeWhile ist längster Prefix so dass p gilt, dropWhile der Rest any :: (α → B o o l ) → [α] → B o o l −−p gilt mind. einmal

a l l :: (α → B o o l ) → [α] → B o o l −−p gilt für alle e l e m :: ( Eq α)α → [α] → B o o l −−Ist enthalten?

z i p W i t h :: (α → βγ) → [α] → [β] → [γ]

−−verallgemeinertes zip

25 [29]

Allgemeine Rekursion

I EinfacheRekursion istSpezialfallderallgemeinen Rekursion

I AllgemeineRekursion:

IRekursion übermehrere Argumente

IRekursion überandere Datenstruktur

IAndere Zerlegungals Kopf und Rest

26 [29]

Beispiele für allgemeine Rekursion: Sortieren

IQuicksort:

Izerlege Liste in Elementekleiner,gleichundgrößerdem ersten,

IsortiereTeilstücke,konkateniereErgebnisse

IMergesort:

IteileListe in derHälfte,

IsortiereTeilstücke, fügeordnungserhaltendzusammen.

27 [29]

Beispiel für allgemeine Rekursion: Mergesort

I Hauptfunktion:

m s o r t :: Ord α⇒ [α]→ [α] m s o r t x s

| l e n g t h x s ≤1 = x s

| o t h e r w i s e = merge ( m s o r t f ) ( m s o r t b ) where ( f , b ) = s p l i t A t ( ( l e n g t h x s ) ‘ d i v ‘ 2 ) x s

I splitAt :: Int→[α]→([α], [α])spaltetListe auf I Hilfsfunktion: ordnungserhaltendes Zusammenfügen

merge :: Ord α⇒ [α]→ [α]→ [α]

merge [ ] x = x merge y [ ] = y merge ( x : x s ) ( y : y s )

| x≤ y = x : ( merge x s ( y : y s ) )

| o t h e r w i s e = y : ( merge ( x : x s ) y s )

28 [29]

Zusammenfassung

IFunktionenhöherer Ordnung

IFunktionen alsgleichberechtigte ObjekteundArgumente

IPartielle Applikation,η-Kontraktion, namenlose Funktionen

ISpezielle Funktionen höherer Ordnung:map,filter,foldund Freunde IFormen derRekursion:

IEinfacheundallgemeineRekursion

IEinfacheRekursion entsprichtfoldr

29 [29]

Referenzen

ÄHNLICHE DOKUMENTE

Einführung in die Technik der Dokumentation (Textdokumente, pdf, Powerpoint-Folien) und Präsentation, mit praktischen Übungen zur rhetorischen und didaktischen

Wir verstehen, wie wir mit map, filter und fold wiederkehrende Funktionsmuster kürzer und verständlicher aufschreiben können, und wir verstehen, warum der Funktionstyp in α → β ein

[r]

[r]

Praktische Informatik 3: Funktionale Programmierung Vorlesung 5 vom 11.11.2014: Funktionen Höherer Ordnung I.. Christoph Lüth Universität Bremen

Praktische Informatik 3: Funktionale Programmierung Vorlesung 6 vom 18.11.2014: Funktionen Höherer Ordnung II.. Christoph Lüth Universität Bremen

Praktische Informatik 3: Funktionale Programmierung Vorlesung 5 vom 13.11.2012: Funktionen Höherer Ordnung I. Christoph Lüth Universität Bremen

Praktische Informatik 3: Funktionale Programmierung Vorlesung 6 vom 20.11.2012: Funktionen Höherer Ordnung II.. Christoph Lüth Universität Bremen