Funktionen -Notation für Funktionen

Werbung
Formale Grundlagen der Informatik (Fuchs/Kraan SS 99)
Formale Grundlagen der Informatik (Fuchs/Kraan SS 99)
Funktionen
-Notation für Funktionen
• Mengentheoretische Sicht: Eine Funktion ist eine spezielle
Art von Menge
• "Übliche" Notation für Funktionen wird schnell
unübersichtlich
• Alternative Sicht: Eine Funktion ist eine Berechnung
• -Notation schafft Abhilfe:
• Church entwickelte dazu das -Kalkül als allgemeine
Notation für Funktionen und Berechnungen.
2
Eine Funktion, die x in x abbildet, wird geschrieben als:
x . x
2
• Funktionen höherer Ordnung: Funktionen, deren
Argumente Funktionen sind:
Eine Funktion, die eine Funktion in die Komposition der
Funktion mit sich selbst abbildet, wird geschrieben als:
F(f) = f f
f . f f
Für f(x) = x + 1 ist F(f)(x) = x + 2 bzw. F(f)(1) = 3.
• Funktionen können damit "namenlos" geschrieben
werden.
Funktionen als Programme 1
Funktionen als Programme 2
Formale Grundlagen der Informatik (Fuchs/Kraan SS 99)
Formale Grundlagen der Informatik (Fuchs/Kraan SS 99)
-Kalkül
Funktionale Programmiersprachen
• -Konversion: x . P(x) = y . P(y)
• Die Grundrechenregeln sind Funktionen.
Der Name der gebundenen Variablen ist unwichtig.
• Grundlage ist immer das -Kalkül.
• Dazu kommen andere "Elemente": Typensysteme, Typen,
Module, usw.
• -Reduktion: (x . P(x))(a) = P(a)
Die einzige "Rechenregel" für das -Kalkül.
• Beispiele: Lisp, Haskell, Miranda, Standard ML
Beispiele:
2
2
(x . x )(2) = 2 = 4
(f . f f)(x . x ) = x . x x . x = x . x
2
2
2
4
((f . f f)(x . x ))(2) = (x . x x . x )(2) = (x . x )(2) =
16
2
2
2
4
((x . y . x + y )(4))(5) = (y . 4 + y)(5) = 4 + 5 = 9
Funktionen als Programme 3
Funktionen als Programme 4
Formale Grundlagen der Informatik (Fuchs/Kraan SS 99)
Formale Grundlagen der Informatik (Fuchs/Kraan SS 99)
Standard ML
Interaktion
• Interaktiv
• Inputprompt -, Abschluss mit ;, Output markiert mit >
• Starkes Typensystem
- 3+2;
• Polymorphes Typensystem
> 5 : int
• Fehlererkennung: Parse error, run-time error, type clash
• Unterstützt abstrakte Typen
• Typeninferenz
- 3 +;
• Statischer Skopus von Identifier
- 3 div 0;
• Unterstützt Module
- 3 + true;
• Unterstützt "pattern matching"
• Formale Definition
Funktionen als Programme 5
Funktionen als Programme 6
Formale Grundlagen der Informatik (Fuchs/Kraan SS 99)
Formale Grundlagen der Informatik (Fuchs/Kraan SS 99)
Typen
Identifiers
• Eingebaute einfache Typen: unit, bool, int, string, real
• Bindung von Werten an Namen, damit Resultate nicht
"verloren" gehen:
• Eingebaute zusammengesetzte Typen:
- val x = 4*5;
1. Tupel
- (true, ());
> (true,()) : bool * unit
> val x = 20 : int
- val s = "abc" ^ "def";
2. Listen
- [];
> [] : ‘a list
- [1,2];
> [1,2] : int list
> val s = "abcdef" : string
- val pair = ( x, s );
> val pair = (20, "abcdef") : int * string
3. Records
• Typeninferenz: Der Typ muss nicht explizit angegeben
werden, wenn er eindeutig ist.
• Zusammengesetze Typen sind Polytypen:
Wenn ‘a und ‘b Typen sind, dann sind auch ‘a list und
‘a * ‘b Typen.
Funktionen als Programme 7
Funktionen als Programme 8
Formale Grundlagen der Informatik (Fuchs/Kraan SS 99)
Formale Grundlagen der Informatik (Fuchs/Kraan SS 99)
Pattern matching
Funktionen
• Automatisch Zerlegung von zusammengesetzten Werten
• Funktionen werden definiert, in dem sie ebenfalls an
Identifier gebunden werden.
- val x = (17, true);
- fun twice x = 2*x;
> val x = (17, true) : int * bool
> val twice = fn : int -> int
- val (left, right) = x;
- twice 4;
> val left = 17 : int
> 8 : int
val right = true : bool
• Funktionen können rekursiv sein.
- val mylist = [1, 2, 3];
- fun fact x = if x = 0 then 1 else x * fact(x - 1);
> val mylist = [1, 2, 3] : int list
> val fact = fn : int -> int
- val [x,y,z] = mylist;
- fact 5;
> val x = 1 : int
> 120 : int
val y = 2 : int
• Funktionen können Fallunterscheidungen machen.
val z = 3 : int
- fun append([],l) = l
- val hd::tl = mylist
| append(hd::tl,l) = hd::append(tl,l);
> val hd = 1 : int
> val append = fn : (‘a list * ‘a list) - > ‘a list
val tl = [2, 3] : int list
Funktionen als Programme 9
Funktionen als Programme 10
Formale Grundlagen der Informatik (Fuchs/Kraan SS 99)
Formale Grundlagen der Informatik (Fuchs/Kraan SS 99)
Funktionen mit mehreren Argumenten
Funktionen mit Funktionen als Argumente
• Die Funktion append ist eine Funktion mit einem
Argument, einem Tupel.
• Beispiel: Die Funktion, die eine andere Funktion auf alle
Elemente einer Liste anwendet.
• Funktionen können auch mehrere Argumente haben.
- fun map f [] = []
map f (hd::tl) = f(hd) :: map f tl ;
- fun times (x:int) (y:int) = x * y
> val times = fn : int -> (int -> int)
> val map fn : (‘a ->‘b) - > (‘a list) -> (‘b list)
- fun twice = times 2;
- val l = [1,2,3,4,5];
> val times = fn : int -> int
> val l = [1,2,3,4,5] : int list
- twice 4;
- map twice l;
> 8 : int
> [2,4,6,8,10] : int list
- times 3 4;
- fun listify x = [x];
> 12 : int
> val listify = fn : ‘a - > ‘a list
- map listify l;
> [[1],[2],[3],[4],[5]] : int list list
Funktionen als Programme 11
Funktionen als Programme 12
Formale Grundlagen der Informatik (Fuchs/Kraan SS 99)
Funktionen mit Funktionen als Argumente
(2)
• Beispiel: Komposition von Funktionen
- fun compose(f, g) (x) = f(g(x));
> val compose = fn : ((‘a ->‘b) * (‘c ->‘a)) -> (‘c ->‘b)
- val funny = compose(listify, twice);
> val funny = fn : int -> int list
- funny 5;
> [10] : int list
Funktionen als Programme 13
Herunterladen