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