Funktionen

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