Haskell, Typen, und Objektorientierung

Größe: px
Ab Seite anzeigen:

Download "Haskell, Typen, und Objektorientierung"

Transkript

1 Haskell, Typen, und Objektorientierung ZIELE dieses Kapitels Haskells Typisierung Milners Polymorpher Typcheck Haskells Typklassen P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 1

2 Typisierung in Haskell Haskell hat eine starke, statische Typisierung. jeder Ausdruck muss einen Typ haben Typchecker berechnet Typen und prüft Typen zur Compilezeit die Theorie sagt: Es gibt keine Typfehler zur Laufzeit d.h. kein dynamischer Typcheck nötig. P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 2

3 Typisierung: Begriffe (andere Programmiersprachen) dynamische Typisierung schwache, statische Typisierung passiert zur Laufzeit. Datenobjekte haben einen Typ zur Laufzeit. bei falschem Aufruf: Laufzeit-Typfehler. Typcheck zur Kompilierzeit Aber man kann Typcheck umgehen deshalb: dynamischer Typcheck notwendig. Laufzeit Typfehler sind möglich Konstanten, Variablen (Bezeichner), Prozeduren und Funktionen haben einen im Programm festgelegten Typ. Typisch: Typen können zur Laufzeit per Programmbefehl abgefragt werden P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 3

4 Typisierung: Begriffe (andere Programmiersprachen) Monomorphe Typisierung Polymorphe Typisierung Alle Objekte, Funktionen haben einen eindeutigen Typ Typvariablen sind verboten Konsequenz: verschiedene Längenfunktionen für Listen von unterschiedlichem Typ Funktion arbeitet auf mehreren Daten-Typen Typvariablen: Mittel zur Schematisierung. parametrischer Polymorphismus. Eine einzige Längenfunktion für alle Listen reicht aus Ist auch in Java 5 für generische Typen anwendbar P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 4

5 Typisierung, Begriffe polymorph: Ein Ausdruck kann viele Typen haben (vielgestaltig, polymorph). Die (teilweise unendliche) Menge der Typen entspricht einem schematischen Typausdruck [α]->int ist das Schema Instanzen sind z.b. [Int]->Int, [Char]->Int, [[Char]]->Int P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 5

6 Syntax von Typen in Haskell (ohne Typklassen) Typ ::= Basistyp ( Typ ) Typvariable Typkonstruktor n { Typ } n (n = Stelligkeit) Basistyp ::= Int Integer Float Rational Char P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 6

7 Syntax von Typen Typkonstruktoren können benutzerdefiniert sein (z.b. Baum α) Vordefinierte Liste [ ] Typkonstruktoren: Tupel (.,...,.) Funktionen (Stelligkeit 2, Infix) Konvention zu Funktionstypen mit a b c d bedeutet: a (b (c d)). P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 7

8 Bemerkungen und Wiederholung spezielle syntaktische Konventionen für Tupel und Listen. Beispiel: Typangabe (Int, Char) [Int] t :: τ Basistypen nennt man elementare Typen Grundtyp: Typ ohne Typvariablen (auch monomorph) polymorph wenn der Typ Typvariablen enthält. P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 8

9 Beispiele [1,2,3] :: [Int] map :: (α β) [α] [β] (:) :: α [α] [α] length :: [α] Int P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 9

10 length :: [α] Int Interpretation der Typen logische Formel: Interpretation: α.length :: [α] Int Für alle Typen α ist length eine Funktion, die vom Typ [α] Int ist. Logisch gilt dann: x.x :: [α] (length x) :: Int P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 10

11 Typregeln Wie berechnet man Typen von Ausdrücken? Anwendung von Funktionen auf Argumente (σ, τ sind Typen) s :: σ τ, t :: σ (s t) :: τ Beispiele: quadrat :: Int Int, 2 : Int (quadrat 2) :: Int + :: Int (Int Int), 1 :: Int (1 +) :: (Int Int) ((1 +) 2) :: Int, 2 :: Int P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 11

12 Typregel Anwendung: mehrere Argumente s :: σ 1 σ 2... σ n τ, t 1 :: σ 1,..., t n :: σ n (s t 1... t n ) :: τ Beispiele + :: Int Int Int, 1 :: Int, 2 :: Int (+ 1 2) :: Int + :: Int Int Int (1 + 2) :: Int P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 12

13 Erweiterung der Anwendungsregel auf polymorphe Typen Ziel: Anwendung der Typregel für length oder map Die Funktion γ ist eine Typsubstitution wenn sie Typen für Typvariablen einsetzt γ(τ) nennt man Instanz von τ Beispiel Typsubstitution: Instanz: γ = {α Char, β Float} γ([α] Int) = [Char] Int P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 13

14 Erweiterung der Anwendungsregel auf polymorphe Typen s : σ τ, t : ρ und γ(σ) = γ(ρ) (s t) :: γ(τ) Hierbei: die Typvariablen in ρ müssen vorher umbenannt werden. P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 14

15 Beispiel zur polymorphen Anwendungsregel Typ von (map quadrat)? map :: (α β) [α] [β] Instanziiere mit: ergibt: {α Int, β Int} map :: (Int Int) [Int] [Int] Regelanwendung ergibt: map : (Int Int) [Int] [Int], quadrat :: (Int Int) (map quadrat) :: [Int] [Int] P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 15

16 Polymorphe Anwendungsregel für n Argumente s :: σ 1 σ 2... σ n τ, t 1 : ρ 1,..., t n : ρ n und i : γ(σ i ) = γ(ρ i ) (s t 1... t n ) :: γ(τ) Die Typvariablen in ρ 1,..., ρ n müssen vorher umbenannt werden. Beachte verwende möglichst allgemeines γ P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 16

17 Beispiel mit Typvariablen id x = x id :: α α. Berechne Typ von (map id) map:: (α β) [α] [β] id:: α α Regelanwendung: d.h. (map id) :: ([α] [α]). map : (α β) ([α] [β]), id :: α α (map id) :: γ([α] [β]) P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 17

18 Berechnung von Typsubstitutionen, die Typen gleichmachen Gegeben: δ i, ρ i, i = 1,..., n Gesucht: γ mit i : γ(δ i ) = γ(ρ i ). Die Berechnung mit den folgenden Regeln nennt man auch Unifikation. P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 18

19 Unifikation durch Transformation der Gleichungen Notation: σ = γ τ statt γ(σ) = γ(τ) Sei G eine Multimenge von Gleichungen, T C ein Typkonstruktor, α eine Typvariable, σ, τ (polymorphe) Typen. Regeln zur Umformung von Gleichungssystemen: (Dekomposition) (T C σ 1... σ m ) = γ (T C τ 1... τ m ), G σ 1 = γ τ 1,..., σ m = γ τ n, G Wenn die Typkonstruktoren rechts und links verschieden sind, dann kann man die Berechnung abbrechen; es kann keine Lösung geben. P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 19

20 Unifikation durch Transformation der Gleichungen: Regeln (Ersetzung) α = γ σ, G α = γ σ, G[σ/α] G[σ/α] bedeutet: Ersetze alle Vorkommen der Typvariablen α durch den Typ σ. Hierbei: Grund: σ darf α nicht enthalten Es gibt keine Lösung Vorsicht: sonst Nichtterminierung P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 20

21 Unifikation durch Transformation der Gleichungen: Regeln (Vereinfachung) α = γ α, G G (Vertauschung) σ = γ τ, G τ = γ σ, G P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 21

22 Unifikation durch Transformation der Gleichungen: Resultat Berechnung ist erfolgreich beendet, wenn das Gleichungssystem von der Form ist: α 1 = γ τ 1,..., α k = γ τ k wobei α i Typvariablen sind, und die α i in keinem τ j auftreten. Die gesuchte Typsubstitution ist ablesbar als γ = {α 1 τ 1,..., α k τ k } P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 22

23 Beispiel map id nochmal; Variante 1 Typsubstitutionen unterschiedlich, je nach Regelanwendung: map :: (α β) [α] [β], id :: α α (map id) :: γ([α] [β]) Berechnen von γ: α β = γ α α α = γ α, β = γ α Das ergibt: γ = {α α, β α } und (map id) :: [α ] [α ] P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 23

24 Beispiel map id Variante 2 Berechnung von γ mit vertauschten Regelanwendungen: α β = γ α α α = γ α, β = γ α α = γ α, β = γ α α = γ α, β = γ α Das ergibt γ = {α α, β α} und (map id) :: [α] [α] Wegen All-Quantifizierung sind die Typen (bis auf Umbenennung) identisch P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 24

25 Typsubstitutionen: Allgemeinere Definition Sei V eine Menge von Typvariablen. und γ, γ zwei Typsubstitutionen. Dann ist γ allgemeiner als γ, wenn es eine weitere Typsubstitution δ gibt, so dass x V : δ(γ(x)) = γ (x) Es gilt: Unifikation berechnet allgemeinste Typsubstitutionen P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 25

26 Beispiel zu Typsubstitutionen γ = {α 1 (α 2, β 2 )} γ = {α 1 (Int, Int)} γ ist allgemeiner als γ : Nehme δ = {α 2 Int, β 2 Int}. Dann ist δ(γ(α 1 )) = (Int, Int) = γ (α 1 ). P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 26

27 Beispiel zu polymorpher Typberechnung Berechne Typ der Liste [1]: [1] = 1 : [] 1 :: Int und [] :: [β] (Typen der Konstanten) (:) :: α [α] [α] Anwendungsregel mit γ = {α Int} ergibt: (1 :) :: [Int] [Int] Anwendungsregel mit γ 2 = {β Int} ergibt: (1 : []) :: [Int] P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 27

28 Beispiel zu Typfehler [1, a ] hat keinen Typ: 1 : ( a : []) (voll geklammert) 1 :: Integer, [] :: [β], a :: Char Typen der Konstanten. (1 :) :: [Integer] [Integer] und a :[] :: [Char]. Kein Typ als Resultat, denn: [Integer] und [Char] sind verschieden unter allen γ. P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 28

29 Beispiel zu Typfehler;Hugs Test > [1, a ] ERROR - Illegal Haskell 98 class constraint in inferred type *** Expression : [1, a ] *** Type : Num Char => [Char] P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 29

30 Typ eines Ausdrucks Typ von (map quadrat [1,2,3,4]) : map:: (α β) [α] [β] quadrat:: Int Integer, und [1, 2, 3, 4] :: [Integer]. γ = {α Integer, β Integer}. Das ergibt: γ(α) = Integer, γ([α]) = [Integer], γ([β]) = [Integer]. Resultat: γ([β]) = [Integer] P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 30

31 Typisierung von Funktionen, Milner Problematik: rekursiv definierte Funktionen Lambda-Ausdrücke, let-ausdrücke Listen-Komprehensionen. Typcheckalgorithmus von Robin Milner (in Haskell und ML) Schnell, liefert allgemeinste (Milner-)Typen schlechte worst-case Komplexität: in seltenen Fällen exponentieller Platzbedarf Liefert in seltenen Fällen nicht die allgemeinsten möglichen polymorphen Typen P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 31

32 Typisierung von Funktionen, Milner Satz zur Milner-Typisierung in Haskell: Sei t ein getypter Haskell-Ausdruck, ohne freie Variablen (d.h. geschlossen). Dann wird die Auswertung des Ausdrucks t nicht mit einem Typfehler abbrechen. P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 32

33 Typisierung rekursiv definierter Funktionen length [] = 0 length (x:xs) = (1 + length xs) der erhaltene Typ ist Num a => [b] -> a Das ist auch der Typ von genericlength im Modul List P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 33

34 Typisierung rekursiv definierter Funktionen Vorgehen bei der Berechnung des Typs einer rekursiven Funktion f x_1... x_n =... Annahmen:f:: α x 1:: β 1... x n:: β n, Resultat: β n+1, Ergibt Typgleichung α = β 1 ->... ->β n ->β n+1 bei Pattern verwende extra Gleichungen x i = p i Typregeln zum Berechnen der Typen der Definitionsgleichung Bei bekannten Funktionen: verwende umbenannten Typ. Bei f: verwende α Lösung von Typgleichungen mittels Unifikationsalgorithmus Gleichsetzen der Typen der linken und rechten Seiten von Definitionsgleichungen Resultat: γ(β 1 ->... ->β n ->β n+1 ) wobei γ die insgesamt berechnete Typsubstitution ist. P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 34

35 Typisierung rekursiv definierter Funktionen (2) [] ++ ys = ys (x:xs) ++ ys = x: (xs++ys) P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 35

36 Typisierung rekursiv definierter Funktionen (2) [] ++ ys = ys (x:xs) ++ ys = x: (xs++ys) Annahmen: x:xs:: β 1, ys:: β 2 α = β 1 β 2 β 3 [] ++ ys = ys β 1 = [α 1 ], β 3 = β 2 (x:xs) x:: α 2, xs:: α 3, ergibt: α 3 = [α 2 ] = β 1 (x:xs) ++ ys [α 1 ] = [α 2 ], also α 1 = α 2 (xs++ys) :: β 2 keine neue Gleichung; x: (xs++ys) β 2 = [α 1 ] Erst hier wird der Resultattyp eingeschränkt! Ergebnis: ++:: [α 1 ] [α 1 ] [α 1 ] P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 36

37 Typisierung und Reduktion, genauer Erinnerung Beta-Reduktion: ((λx.t) s) t[s/x] λx.t :: τ 1 τ 2, s :: σ, γ(τ 1 ) = γ(σ) ((λx.t) s) : γ(τ 2 ) Zum Ermitteln von γ(τ 2 ) benötigt man eine Typsubstitution γ, so dass γ(τ 1 ) = γ(σ) ist. P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 37

38 Typisierung und Reduktion, genauer ((λx.t) s) t[s/x] Was ist der Typ von t[s/x]? Beh: ((λx.t) s) :: τ impliziert t[s/x] :: τ Argumentation: Milner-Typcheck beachtet nur den Typ der Unterterme, nicht deren syntaktische Form. Typ von x und s ist aber gleich (als Unterterm von t) denn γ(τ 1 ) = γ(σ) Folgerung: auch mehrere Beta-Reduktionen erhalten den ursprünglichen Typ Analoge Argumentation für andere Auswertungsregeln! P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 38

39 Typisierung und Reduktion, genauer Beachte: Nach Beta-Reduktion kann ein Ausdruck mehr Typen haben Beispiel: (((λx.(λy.x)) 1) u) Beta-Reduktion: (λy.1) u Beta-Reduktion: 1 u ungetypt. Deshalb ist der Ausdruck ungetypt. ungetypt getypt; vom Typ Integer P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 39

40 Bemerkungen zu anderen Programmiersprachen Lisp und Scheme (strikte funktionale Programmiersprachen) haben kein statisches Typsystem. der Grund liegt in der Konzeption, z.b. der Booleschen Werte In Lisp: Nil bedeutet auch False, alles andere gilt als True. Auswertung: 1 = 0 Nil, 1 = 1 1. Weitere Schwierigkeit: Typeffekte von Zuweisungen P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 40

41 Bemerkungen zu anderen Programmiersprachen Verwendung der arithmetischen Operatoren Überladung von +,,... Manche Programmiersprachen nutzen automatische (dynamische) Typkonversion Haskell: keine Typkonversion eingegebene Zahlkonstanten sind überladen 1 wird vom Compiler als (frominteger 1) eingefügt Typkonversion von Hand einfügen: Z.B. pi + 2%3 ergibt einen Typfehler, pi + (fromrational (2%3)) ::Double ergibt P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 41

42 Python und Typisierung Python ist statisch ungetypt. Vermutlich wäre ein monomorphes Typsystem für Python möglich Man muss syntaktische Elemente hinzufügen Schwierige Kombination: Python erlaubt Lambda-Ausdrücke und Zuweisung P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 42

43 Java und Typisierung Java 1.4 ist streng getypt. Das Typsystem ist monomorph. die Java-Klassen entsprechen den elementaren Typen. Zusätzlich gibt es einen Untertyp-Begriff für Klassen. Die dynamischen Typfehler sind meist (cast)-fehler. Java 5 ist streng getypt. Das Typsystem ist polymorph. Zusätzlich gibt es einen Untertyp-Begriff für Klassen. Kompliziertere statische Typangaben nötig Weniger dynamische Typfehler. P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite 43

Haskell, Typen und Typberechnung

Haskell, Typen und Typberechnung Kapitel 5 Haskell, Typen und Typberechnung 5.1 Typisierung in Haskell In diesem Kapitel sind die Typisierungsmethoden in Haskell beschrieben, wobei auch kurz auf die Typisierung in anderen Programmiersprachen

Mehr

Haskell, Typen und Typberechnung

Haskell, Typen und Typberechnung Kapitel 5 Haskell, Typen und Typberechnung 5.1 Typisierung in Haskell In diesem Kapitel sind die Typisierungsmethoden in Haskell beschrieben, wobei auch kurz auf die Typisierung in anderen Programmiersprachen

Mehr

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Überladung und Konversion in Haskell. Typisierung in Haskell

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Überladung und Konversion in Haskell. Typisierung in Haskell Haskell, Typen, und Typberechnung Grundlagen der Programmierung 3 A Typen, Typberechnung und Typcheck Prof. Dr Manfred Schmidt-Schauß Ziele: Haskells Typisierung Typisierungs-Regeln Typ-Berechnung Sommersemester

Mehr

Haskell, Typen und Typberechnung

Haskell, Typen und Typberechnung Kapitel 3 Haskell, Typen und Typberechnung 3.1 Typisierung in Haskell In diesem Kapitel sind die Typisierungsmethoden in Haskell beschrieben, wobei auch kurz auf die Typisierung in anderen Programmiersprachen

Mehr

Grundlagen der Programmierung 3 A

Grundlagen der Programmierung 3 A Grundlagen der Programmierung 3 A Typen, Typberechnung und Typcheck Prof. Dr. Manfred Schmidt-Schauß Sommersemester 2017 Haskell, Typen, und Typberechnung Ziele: Haskells Typisierung Typisierungs-Regeln

Mehr

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell

Haskell, Typen, und Typberechnung. Grundlagen der Programmierung 3 A. Einige andere Programmiersprachen. Typisierung in Haskell Haskell, Typen, und Typberechnung Grundlagen der Programmierung 3 A Typen, Typberechnung und Typcheck Prof. Dr. Manfred Schmidt-Schauß Ziele: Haskells Typisierung Typisierungs-Regeln Typ-Berechnung Milners

Mehr

Einführung in die funktionale Programmierung

Einführung in die funktionale Programmierung Einführung in die funktionale Programmierung Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 26. Oktober 2006 Haskell - Einführung Syntax Typen Auswertung Programmierung

Mehr

Einführung in die funktionale Programmierung

Einführung in die funktionale Programmierung Einführung in die funktionale Programmierung Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 17. Oktober 2006 Einführung in Haskell: Syntax, Reduktionen, Kernsprachen Haskell,

Mehr

Grundlagen der Programmierung 2 (1.A)

Grundlagen der Programmierung 2 (1.A) Grundlagen der Programmierung 2 (1.A) Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 18. April 2007 Grundlagen der Programmierung 2: Geplanter Inhalt der ersten Hälfte

Mehr

Übersicht. Einführung in die Funktionale Programmierung: Ziele des Kapitels. Typisierung Prof Dr. Manfred Schmidt-Schauß WS 2012/13

Übersicht. Einführung in die Funktionale Programmierung: Ziele des Kapitels. Typisierung Prof Dr. Manfred Schmidt-Schauß WS 2012/13 Übersicht Einführung in die Funktionale Programmierung: Typisierung Prof Dr. Manfred Schmidt-Schauß WS 2012/13 1 Motivation 2 Typen: Sprechweisen, Notationen und Unifikation 3 Typisierungsverfahren Iteratives

Mehr

Einführung in die funktionale Programmierung

Einführung in die funktionale Programmierung Einführung in die funktionale Programmierung Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 28. Oktober 2008 Einführung in Haskell: Syntax, Reduktionen, Kernsprachen Haskell,

Mehr

Grundlagen der Programmierung 2. Operationale Semantik

Grundlagen der Programmierung 2. Operationale Semantik Grundlagen der Programmierung 2 Operationale Semantik Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 29. April 2009 Semantik von Programmiersprachen Semantik = Bedeutung

Mehr

Programmiersprachen: Klassifizierung und Methoden. Programmier-Paradigmen. Grundlagen der Programmierung 2 (1.C) - 1 -

Programmiersprachen: Klassifizierung und Methoden. Programmier-Paradigmen. Grundlagen der Programmierung 2 (1.C) - 1 - Programmiersprachen: Klassifizierung und Methoden Programmier-Paradigmen Grundlagen der Programmierung 2 (1.C) - 1 - Programmiersprachen: Begriffe Syntax Beschreibung der Programme als Texte let xyz =

Mehr

Der einfach getypter Lambda-Kalkül

Der einfach getypter Lambda-Kalkül Der einfach getypter Lambda-Kalkül Typprüfung und Typinferenz Tobias Nipkow und Steffen Smolka Technische Universität München 1 Einleitung 2 Explizit getypter λ-kalkül 3 Implizit getypter λ-kalkül Statische

Mehr

Lösungen zum Aufgabenblatt 10 Logik und modelltheoretische Semantik

Lösungen zum Aufgabenblatt 10 Logik und modelltheoretische Semantik Lösungen zum Aufgabenblatt 10 Logik und modelltheoretische Semantik Universität München, CIS, SS 2013 Hans Leiß Abgabetermin: Do, 4.7.2013, 16 Uhr, in meinem Postfach Aufgabe 10.1 Vereinfache die folgenden

Mehr

Operationale Semantik: Haskell

Operationale Semantik: Haskell Kapitel 4 Operationale Semantik: Haskell 4.1 Semantik von Programmiersprachen Programme sind zunächst mal nur Text. Programme sollen aber etwas im Rechner bewirken bzw. eine Funktion oder Funktionalität

Mehr

Die Definition eines Typen kann rekursiv sein, d.h. Typ-Konstruktoren dürfen Elemente des zu definierenden Typ erhalten.

Die Definition eines Typen kann rekursiv sein, d.h. Typ-Konstruktoren dürfen Elemente des zu definierenden Typ erhalten. 4.5.5 Rekursive Typen Die Definition eines Typen kann rekursiv sein, d.h. Typ-Konstruktoren dürfen Elemente des zu definierenden Typ erhalten. datatype IntList = Nil Cons o f ( i n t IntList ) ; Damit

Mehr

Kapitel 6: Typprüfung

Kapitel 6: Typprüfung Ludwig Maximilians Universität München Institut für Informatik Lehr- und Forschungseinheit für Datenbanksysteme Skript zur Vorlesung Informatik I Wintersemester 2006 Vorlesung: Prof. Dr. Christian Böhm

Mehr

Funktionale Programmierung ALP I. Funktionen höherer Ordnung SS Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda

Funktionale Programmierung ALP I. Funktionen höherer Ordnung SS Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda ALP I SS 2011 Funktionstypen Funktionen haben einen Datentyp, der folgende allgemeine Form hat: functionname :: T 1 -> T 2, wobei T 1, T 2 wiederum beliebige Datentypen sind Beispiel: T 1 T 2 Der Datentyp

Mehr

Stackmaschine; Speicheradressierung

Stackmaschine; Speicheradressierung Stackmaschine; Speicheradressierung Erweiterung um globalen Speicher (Heap, Halde) pro Speicherplatz eine Zahl. Notation ist als Array SP [0..]. Zugriff mittels Adresse (Index): eine Zahl i.a.: Zahlen

Mehr

Typklassen und Überladung in Haskell

Typklassen und Überladung in Haskell Typklassen und Überladung in Haskell Überladung: Es gibt mehrere Funktionen mit gleichem Namen. der Typ der Argumente bestimmt, welche gemeint ist. (1; i) + (3; 2i) statt (1, i) complexadd (3; 2i). Haskell-Typklassen:

Mehr

Programmieren in Haskell Programmiermethodik

Programmieren in Haskell Programmiermethodik Programmieren in Haskell Programmiermethodik Peter Steffen Universität Bielefeld Technische Fakultät 12.01.2011 1 Programmieren in Haskell Bisherige Themen Was soll wiederholt werden? Bedienung von hugs

Mehr

Programmieren in Haskell

Programmieren in Haskell Programmieren in Haskell Wir steigen ein... Programmieren in Haskell 1 Was wir heute machen Umfrage: Wer hat den Hugs ausprobiert? Ausdrücke und Werte Datentypen Funktionen Aufgabe für diese Woche Programmieren

Mehr

Listen und Listenfunktionen. Grundlagen der Programmierung 2 A (Listen) Listen und Listenfunktionen. Listen? Haskell: Listen

Listen und Listenfunktionen. Grundlagen der Programmierung 2 A (Listen) Listen und Listenfunktionen. Listen? Haskell: Listen Listen und Listenfunktionen Grundlagen der Programmierung 2 A (Listen) Haskell: Listen Prof. Dr. Manfred Schmidt-Schauß Listen modellieren Folgen von gleichartigen, gleichgetypten Objekten. Ausdruck im

Mehr

Grundlagen der Programmierung 2 (1.A)

Grundlagen der Programmierung 2 (1.A) Grundlagen der Programmierung 2 (1.A) Einführung Prof. Dr. Manfred Schmidt-Schauß Sommersemester 2017 Grundlagen der Programmierung 2 Geplanter Inhalt der ersten Hälfte: Programmieren in Haskell Definitionen;

Mehr

Programmieren in Haskell Einstieg in Haskell

Programmieren in Haskell Einstieg in Haskell Programmieren in Haskell Einstieg in Haskell Peter Steffen Universität Bielefeld Technische Fakultät 24.10.2008 1 Programmieren in Haskell Was wir heute machen Umfrage: Wer hat den Hugs ausprobiert? Ausdrücke

Mehr

Haskell und Python. pures Programmieren, Auswerten von Ausdrücken rekursives Programmieren, Typsystem. Python: Eine prozedurale Programmiersprache

Haskell und Python. pures Programmieren, Auswerten von Ausdrücken rekursives Programmieren, Typsystem. Python: Eine prozedurale Programmiersprache Haskell und Python Haskell: Eine funktionale Programmiersprache funktional, nicht-strikt, hat ein polymorphes und starkes Typsystem, flexible Datenstrukturen, gute Abstraktionseigenschaften, Ziele: pures

Mehr

Grundlagen der Programmierung 2 (1.A)

Grundlagen der Programmierung 2 (1.A) Grundlagen der Programmierung 2 (1.A) Einführung Prof. Dr. Manfred Schmidt-Schauß Sommersemester 2015 Grundlagen der Programmierung 2 Geplanter Inhalt der ersten Hälfte: Programmieren in Haskell Definitionen;

Mehr

Beweise und Typen. 9.1 Formalisierung und Beweis

Beweise und Typen. 9.1 Formalisierung und Beweis 120 9. Beweise und Typen 9 Beweise und Typen Dieses Kapitel ist zweigeteilt. Als erstes wenden wir uns dem Thema zu, wie wir Eigenschaften von funktionalen Programmen beweisen können. Aufwandsabschätzungen

Mehr

Beispiel: Hamming-Folge Erzeuge eine Folge X = x 0,x 2,... mit folgenden Eigenschaften: 1. x i+1 > x i für alle i

Beispiel: Hamming-Folge Erzeuge eine Folge X = x 0,x 2,... mit folgenden Eigenschaften: 1. x i+1 > x i für alle i Beispiel: Hamming-Folge Erzeuge eine Folge X = x 0,x 2,... mit folgenden Eigenschaften: 1. x i+1 > x i für alle i FP-8.7 2. x 0 = 1 3. Falls x in der Folge X auftritt, dann auch 2x, 3x und 5x. 4. Nur die

Mehr

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie

Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom : Typvariablen und Polymorphie Rev. 2749 1 [28] Praktische Informatik 3: Funktionale Programmierung Vorlesung 4 vom 04.11.2014: Typvariablen und Polymorphie Christoph Lüth Universität Bremen Wintersemester 2014/15 2 [28] Fahrplan Teil

Mehr

Basiskonstrukte von Haskell

Basiskonstrukte von Haskell Basiskonstrukte von Haskell PD Dr. David Sabel Goethe-Universität Frankfurt am Main 29. September 2015 Basistypen und Operationen Ganzzahlen: Int = Ganzzahlen beschränkter Länge Integer = Ganzzahlen beliebiger

Mehr

Abschnitt 11: Korrektheit von imperativen Programmen

Abschnitt 11: Korrektheit von imperativen Programmen Abschnitt 11: Korrektheit von imperativen Programmen 11. Korrektheit von imperativen Programmen 11.1 11.2Testen der Korrektheit in Java Peer Kröger (LMU München) in die Programmierung WS 16/17 931 / 961

Mehr

LR-Parser, Shift-Reduce-Verfahren

LR-Parser, Shift-Reduce-Verfahren LR-Parser, Shift-Reduce-Verfahren Bottom-Up-Syntaxanalyse LR-Parser L: Eingabe von links nach rechts; R: Rechtsherleitung Shift-Reduce-Verfahren Beachte: Kein Backtracking nicht auf jede Grammatik anwendbar

Mehr

Programmieren in Haskell Das Haskell Typsystem

Programmieren in Haskell Das Haskell Typsystem Programmieren in Haskell Das Haskell Typsystem Peter Steffen Robert Giegerich Universität Bielefeld Technische Fakultät 22.01.2010 1 Programmieren in Haskell Belauscht... Lisa Lista: Ohne Typen keine korrekten

Mehr

HASKELL KAPITEL 2.1. Notationen: Currying und das Lambda-Kalkül

HASKELL KAPITEL 2.1. Notationen: Currying und das Lambda-Kalkül HASKELL KAPITEL 2.1 Notationen: Currying und das Lambda-Kalkül Bisheriges (Ende VL-Teil 1) weite :: (Float,Float) ->Float weite (v0, phi) = (square(v0)/9.81) * sin(2 * phi) (10, 30 ) smaller ::(Integer,

Mehr

Grundlegende Datentypen

Grundlegende Datentypen Funktionale Programmierung Grundlegende Datentypen Fakultät für Informatik und Mathematik Hochschule München Letzte Änderung: 14.11.2017 15:37 Inhaltsverzeichnis Typen........................................

Mehr

Funktionale Programmierung Grundlegende Datentypen

Funktionale Programmierung Grundlegende Datentypen Grundlegende Datentypen Prof. Dr. Oliver Braun Fakultät für Informatik und Mathematik Hochschule München Letzte Änderung: 06.11.2017 16:45 Inhaltsverzeichnis Typen........................................

Mehr

Grundlagen der Programmierung 2 (1.A)

Grundlagen der Programmierung 2 (1.A) Grundlagen der Programmierung 2 (1.A) Einführung Prof. Dr. Manfred Schmidt-Schauß Sommersemester 2018 Grundlagen der Programmierung 2 Geplanter Inhalt der ersten Hälfte: Programmieren in Haskell Definitionen;

Mehr

Grundprinzipien der funktionalen Programmierung

Grundprinzipien der funktionalen Programmierung Grundprinzipien der funktionalen Programmierung Funktionen haben keine Seiteneffekte Eine Funktion berechnet einen Ausgabewert der nur von den Eingabewerten abhängt: 12 inputs + output 46 34 2 Nicht nur

Mehr

HASKELL KAPITEL 8. Bäume

HASKELL KAPITEL 8. Bäume HASKELL KAPITEL 8 Bäume Baum rekursiv definierte Datenstruktur nicht linear vielerlei Varianten: Struktur der Verzweigung, Ort der gespeicherten Information (Knoten, Kanten, Blätter ) 2 Binärbaum Jeder

Mehr

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Wiederholung Kapitel 4. Birgit Engels, Anna Schulze WS 07/08

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Wiederholung Kapitel 4. Birgit Engels, Anna Schulze WS 07/08 Kapitel 4 Programmierkurs Birgit Engels, Anna Schulze Wiederholung Kapitel 4 ZAIK Universität zu Köln WS 07/08 1 / 23 2 Datentypen Arten von Datentypen Bei der Deklaration einer Variablen(=Behälter für

Mehr

Generizität, Abstraktion, Rekursion

Generizität, Abstraktion, Rekursion Kapitel 17 Generizität, Abstraktion, Rekursion 17.1 Generische Klassen Fragen: was ist der Typ einer generischen Klasse? Kann man zwischen generischen Klassen Vererbung definieren? Kann man zwischen generischen

Mehr

Gliederung. n Teil I: Einleitung und Grundbegriffe. n Teil II: Imperative und objektorientierte Programmierung

Gliederung. n Teil I: Einleitung und Grundbegriffe. n Teil II: Imperative und objektorientierte Programmierung Gliederung n Teil I: Einleitung und Grundbegriffe l 1. Organisatorisches l 2. Grundlagen von Programmiersprachen n Teil II: Imperative und objektorientierte Programmierung l 1. Grundelemente der Programmierung

Mehr

Einführung in die Informatik 2

Einführung in die Informatik 2 Technische Universität München Fakultät für Informatik Prof. Tobias Nipkow, Ph.D. Lars Noschinski, Dr. Jasmin Blanchette, Dmitriy Traytel Wintersemester 2012/13 Lösungsblatt Endklausur 9. Februar 2013

Mehr

5.3 Auswertung von Ausdrücken

5.3 Auswertung von Ausdrücken 5.3 Auswertung von Ausdrücken Funktionen in Java bekommen Parameter/Argumente als Input, und liefern als Output den Wert eines vorbestimmten Typs. Zum Beispiel könnte man eine Funktion i n t min ( i n

Mehr

Einleitung Typsystem Typisierung Zusammenfassung Literatur. Typisierung. Effiziente Programmierung. Thomas Schnieders

Einleitung Typsystem Typisierung Zusammenfassung Literatur. Typisierung. Effiziente Programmierung. Thomas Schnieders Typisierung Effiziente Programmierung Thomas Schnieders Fachbereich Informatik Fakultät für Mathematik, Informatik und Naturwissenschaften Universität Hamburg 2018-04-26 Thomas Schnieders Typisierung 1

Mehr

3. Java - Sprachkonstrukte I

3. Java - Sprachkonstrukte I Lernziele 3. Java - Sprachkonstrukte I Namen und Bezeichner, Variablen, Zuweisungen, Konstanten, Datentypen, Operationen, Auswerten von Ausdrücken, Typkonversionen Sie kennen die grundlegensten Bausteine

Mehr

Programmieren in Haskell

Programmieren in Haskell Programmieren in Haskell Wir steigen ein... Programmieren in Haskell 1 Was wir heute machen Umfrage: Wer hat den Hugs ausprobiert? Ausdrücke und Werte Datentypen Funktionen Aufgabe für s Wochenende Programmieren

Mehr

3. Java - Sprachkonstrukte I

3. Java - Sprachkonstrukte I 84 3. Java - Sprachkonstrukte I Namen und Bezeichner, Variablen, Zuweisungen, Konstanten, Datentypen, Operationen, Auswerten von Ausdrücken, Typkonversionen Namen und Bezeichner 85 Ein Programm (also Klasse)

Mehr

3. Java - Sprachkonstrukte I

3. Java - Sprachkonstrukte I Namen und Bezeichner Ein Programm (also Klasse) braucht einen Namen 3. Java - Sprachkonstrukte I Namen und Bezeichner, Variablen, Zuweisungen, Konstanten, Datentypen, Operationen, Auswerten von Ausdrücken,

Mehr

1. Typen 1.1 Typsicherheit 1.2 Typprüfung

1. Typen 1.1 Typsicherheit 1.2 Typprüfung 1. Typen 1.1 Typsicherheit 1.2 Typprüfung Ein Typsystem ist ein praktikables, syntaktisches Verfahren, mit dem man die Abwesenheit gewisser Laufzeit-Eigenschaften eines Programms beweisen kann, indem man

Mehr

Verarbeitung unendlicher Datenstrukturen Jetzt können wir z.b. die unendliche Liste aller geraden Zahlen oder aller Quadratzahlen berechnen:

Verarbeitung unendlicher Datenstrukturen Jetzt können wir z.b. die unendliche Liste aller geraden Zahlen oder aller Quadratzahlen berechnen: Verarbeitung unendlicher Datenstrukturen Jetzt können wir z.b. die unendliche Liste aller geraden Zahlen oder aller Quadratzahlen berechnen: take 1 0 ( f i l t e r ( fn x => x mod 2=0) nat ) ; val it =

Mehr

Funktionale Programmierung. Das Funktionale Quiz. Das Funktionale Quiz. Das Funktionale Quiz

Funktionale Programmierung. Das Funktionale Quiz. Das Funktionale Quiz. Das Funktionale Quiz Funktionale Programmierung Das Funktionale Quiz 31.5.2005 Nenne eine Gemeinsamkeit zwischen Typklassen und OO-Klassen Das Funktionale Quiz Das Funktionale Quiz Nenne einen Unterschied zwischen Typklassen

Mehr

ProInformatik: Funktionale Programmierung. Punkte

ProInformatik: Funktionale Programmierung. Punkte ProInformatik: Funktionale Programmierung 27.7-22.8.2008, M. Knobelsdorf Probeklausur Ihre persönliche Klausurnummer: Vorname, Nachname: Aufgabe 1 2 3 4 5 6 7 8 Punkte 12 4 4 4 4 2 4 6 40 Erz. Punkte Zum

Mehr

Einführung in Haskell

Einführung in Haskell Kapitel 2 Einführung in Haskell Dieses Kapitel enthält eine Einführung in Haskell, eine nicht-strikte funktionale Programmiersprache mit polymorphem Typsystem. Ziel in diesem Kapitel ist: Darstellung der

Mehr