3.1.4 Benutzerdefinierte Datentypen
|
|
- Helene Schumacher
- vor 5 Jahren
- Abrufe
Transkript
1 3.1.4 Benutzerdefinierte Datentypen Übersicht: Vereinbarung von Typbezeichnern Deklaration neuer Typen Summentypen Rekursive Datentypen Fast alle modernen Spezifikations- und Programmiersprachen gestatten es dem Benutzer, neue Typen zu definieren. Vereinbarung von Typbezeichnern ML erlaubt es, Bezeichner für Typen zu deklarieren (vgl. Folie 105). Dabei wird kein neuer Typ definiert, sondern nur ein Typ an einen Bezeichner gebunden. 08/06/08 58
2 Beispiele: (Typvereinbarungen) type intpaar = int * int type charlist = char list type adresse = string * string* string * int type telefonbuch = ( adresse * string list ) list type intnachint = int! int ; val fakultaet : intnachint = fac ; Typvereinbarungen sind nur Abkürzungen. Zwei unterschiedliche Bezeichner können den gleichen Typ bezeichnen; z.b.: - type inttripel = int * int * int; type inttripel = int * int * int - type date = int * int * int; type date = int * int * int - fun kalenderwoche (d:date): int =... ; val kalenderwoche = fn : date -> int - kalenderwoche (192,45,111111); 08/06/08 59
3 Deklaration neuer Typen Neue Typen werden in ML mit dem datatype-konstrukt definiert, das im Folgenden schrittweise erläutert wird. Definition eines neuen Typs und Konstruktors: datatype <Typbezeichner> = <Konstruktorbezeichner> of <TypAusdruck> Die obige Datatypdeklaration definiert: - einen neuen Typ und bindet ihn an <Typbezeichner> - eine Konstruktorfunktion, die Werte des durch den Typausdruck beschriebenen Typs in den neuen Typ einbettet. Die Konstruktorfunktion ist injektiv. 08/06/08 60
4 Beispiel: (Definition von Typ und Konstruktor) datatype person = Student of string * string * int * int definiert den neuen Typ person und den Konstruktor Student: string*string*int*int -> person Wir definieren die Selektorfunktionen: - fun vorname (Student(v,n,g,m)) = v ; val vorname = fn : person -> string - fun name (Student(v,n,g,m)) = n ; val name = fn : person -> string - fun geburtsdatum (Student(v,n,g,m)) = g ; val geburtsdatum = fn : person -> int - fun matriknr (Student(v,n,g,m)) = m ; val matriknr = fn : person -> int 08/06/08 61
5 Jede Datentypdeklaration definiert einen neuen Typ, d.h. insbesondere: - Werte vom Argumentbereich des Konstruktors sind inkompatibel mit dem neuen Typ; - Werte strukturgleicher benutzerdefinierter Typen sind inkompatibel. Beispiele: (Typkompatibilität) 1. Der Typ person ist inkompatibel mit dem Typ string*string*int*int, insbesondere ist vorname ( Niels, Bohr, , 221) nicht typkorrekt. 2. Der Typ person ist inkompatibel mit dem strukturgleichen Typ adresse datatype adresse = WohnAdresse of string * string * int * int Insbesondere ist name (WohnAdresse( Pfaffenbergstraße, nicht typkorrekt. Kaiserslautern, 27, ) ) 08/06/08 62
6 Bemerkung: Den Konstruktor kann man sich als eine Markierung der Werte seines Argumentbereichs vorstellen. Dabei werden Werte mit unterschiedlicher Markierung als verschieden betrachtet. Summentypen Ein Summentyp stellt die disjunkte Vereinigung der Elemente anderen Typen zu einem neuen Typ dar. Die meisten modernen Programmiersprachen unterstützen die Deklaration von Summentypen. Summentypen in ML: Bei einer Datentypdeklaration kann man verschiedene Alternativen angeben: datatype <Typbezeichner> = <Konstruktorbezeichner1> of <TypAusdruck1>... <KonstruktorbezeichnerN> of <TypAusdruckN> 08/06/08 63
7 Beispiele: (Summentypen) 1. Ein anderer Datentyp zur Behandlung von Personen: datatype person2 = Student of string*string*int*int Mitarbeiter of string*string*int*int Professor of string*string*int*int*string 2. Eine benutzerdefinierte Datenstruktur für Zahlen: - datatype number = Intn of int Realn of real - fun isint (Intn m) = true isint (Realn r) = false ; val isint = fn : number -> bool - fun isreal (Intn m) = false isreal (Realn r) = true ; val isreal = fn : number -> bool - fun neg (Intn m) = Intn (~m) neg (Realn r) = Realn (~r); val neg = fn : number -> number 08/06/08 64
8 - fun plus (Intn m,intn n) = Intn (m+n) plus (Intn m,realn r) = Realn((real m) +r) plus (Realn r,intn m) = Realn(r+(real m)) plus (Realn r,realn q)= Realn(r+q); val plus = fn : number * number -> number Begriffsklärung: Konstruktorfunktionen oder Konstruktoren liefern Werte des neu definierten Datentyps. Sie können in Mustern verwendet werden (z.b.: Student, Intn). Diskriminatorfunktionen oder Diskriminatoren prüfen, ob der Wert eines benutzerdefinierten Datentyps zu einer bestimmten Alternative gehört (Beispiel: isint). Selektorfunktionen oder Selektoren liefern Komponenten von Werten des definierten Datentyps (z.b.: vorname, name,...). Bemerkung: In funktionalen Sprachen kann man meist auf Selektorfunktionen verzichten. Man wendet stattdessen Pattern. 08/06/08 65
9 Weitere Formen des datatype-konstrukts: Das datatype-konstrukt kann auch verwendet werden, um Aufzählungstypen zu definieren. Dabei wird in den Alternativen der Teil beginnend mit dem Schlüsselwort of weggelassen. Die Wertemenge eines Aufzählungstyps ist eine endliche Menge (von Namen). Beispiele: (Aufzählungstypen) - datatype wochentag = Montag Dienstag Mittwoch Donnerstag Freitag Samstag Sonntag ; - fun istmittwoch Mittwoch = true istmittwoch w = false ; Oder knapper: - fun istmittwoch w = (w=mittwoch) ; 08/06/08 66
10 Beide Formen der Datentypdeklaration können kombiniert werden; z.b.: - datatype intbottom = Bottom Some of int Datentypdeklarationen lassen sich parametrisieren. Die Typparameter werden dabei vor den vereinbarten Typbezeichner gestellt: - datatype a bottom = Bottom Some of a ML sieht dafür standardmäßig den folgenden Typ vor: - datatype a option = NONE SOME of a Zur Erweiterung von Summentypen Im Gegensatz zur objektorientierten Programmierung (vgl. Kapitel 5) lassen sich die Summentypen in der funktionalen Programmierung meist nicht erweitern, d.h. einem definierten Datentyp können im Nachhinein keine Alternativen hinzugefügt werden. 08/06/08 67
11 Beispiel: (Erweiterung von Summentypen) Den Datentyp person2: datatype person2 = Student of string*string*int*int Mitarbeiter of string*string*int*int Professor of string*string*int*int*string hätte man aus person durch Hinzufügen der Alternativen für Mitarbeiter und Professoren gewinnen können. Bemerkung: Die Möglichkeit, einen Datentypen T nachträglich erweitern zu können, bringt zwei Vorteile für die Wiederverwendung mit sich: 1. Der Programmieraufwand wird reduziert. 2. Programme, die für T entwickelt wurden, können teilweise weiter benutzt werden. In ML müssen Erweiterungen im Allg. durch neue Summentypen realisiert werden. 08/06/08 68
12 Beispiel: Ein Datentyp dt : datatype dt = Constr1 of t1 Constr2 of t2 Constr3 of t3 Constr4 of t4 soll eine fünfte Alternative bekommen. Statt alle existierenden Programme auf fünf Alternativen umzustellen, kann man mit dtneu arbeiten: datatype dtneu = Constr0 of dt Constr5 of t5 Nachteil: Die Programme müssen auf dtneu angepasst werden. Bemerkung: Der Datentyp exn ist in ML erweiterbar. Jede Ausnahme-Vereinbarung fügt eine Alternative hinzu. 08/06/08 69
13 Rekursive Datentypen Von großer Bedeutung in der Programmierung sind rekursive Datentypen. Definition: (rekursive Datentypdeklaration) Eine Datentypdeklaration heißt direkt rekursiv, wenn der definierte Typ in einer der Alternativen der Datentypdeklaration vorkommt. Wie bei Funktionen gibt es auch verschränkt rekursive Datentypdeklarationen. Eine Datentypdeklaration heißt rekursiv, wenn sie direkt rekursiv ist oder Element einer Menge verschränkt rekursiver Datentypdeklarationen ist. Begriffsklärung: (rekursiver Datentyp) Ein Datentyp heißt rekursiv, wenn er mit einer rekursiven Datentypdeklaration definiert wurde. 08/06/08 70
14 Beispiele: (Listendatentypen) 1. Ein Datentyp für Integer-Listen: - datatype intlist = nil Cons of int * intlist ; 2. Ein Datentyp für homogene Listen mit Elementen von beliebigem Typ: - datatype a list = Vorsicht: nil Cons of a * a list Diese Deklaration verdeckt den vordefinierten Datentyp a list. 3. Der vordefinierte Datentyp für homogene Listen mit Elementen von beliebigem Typ: - datatype a list = nil :: of a * a list 08/06/08 71
15 Baumartige Datenstrukturen: Ottmann, Widmayer: Bäume gehören zu den wichtigsten in der Informatik auftretenden Datenstrukturen. A B D E C F G Begriffsklärung: (zu Bäumen) In einem endlich verzweigten Baum hat jeder Knoten endlich viele Kinder. Üblicherweise sagt man, die Kinder sind von links nach rechts geordnet.. Einen Knoten ohne Kinder nennt man Blatt, einen Knoten mit Kindern einen inneren Knoten oder Zweig. Den Knoten ohne Elter nennt man Wurzel. H 08/06/08 72
16 Ein Baum heißt markiert, wenn jeder Knoten k eine Markierung m(k) besitzt. In einem Binärbaum ist jeder Knoten entweder ein Blatt, oder er hat genau zwei Kinder. Zu jedem Knoten gehört ein Unterbaum. Datentyp für markierte Binärbaume: - datatype intbbaum = Blatt of int Zweig of int * intbbaum * intbbaum ; - val einbaum = Zweig (7, Zweig(3,(Blatt 2),(Blatt 4)), (Blatt 5)); - fun m (Blatt n) = n m (Zweig (n,lk,rk)) = n ; Ein mit ganzen Zahlen markierter Binärbaum heißt sortiert, wenn für alle Knoten k gilt: - Die Markierungen der linken Nachkommen von k sind kleiner als m(k). - Die Markierungen der rechten Nachkommen von k sind größer als m(k). 08/06/08 73
17 Aufgabe: Prüfe, ob ein Baum vom Typ intbbaum sortiert ist. Idee: Berechne zu jedem Unterbaum die minimale und maximale Markierung und prüfe rekursiv die Sortiertheitseigenschaft für alle Knoten/Unterbäume. fun maxmark (Blatt n) = n maxmark (Zweig (n,l,r)) = Int.max(n,Int.max(maxmark l, maxmark r)) fun minmark (Blatt n) = n minmark (Zweig (n,l,r)) = Int.min(n,Int.min(minmark l, minmark r)) fun istsortiert (Blatt n) = true istsortiert (Zweig (n,l,r)) = istsortiert l andalso istsortiert r andalso (maxmark l)<n andalso n<(minmark r) istsortiert einbaum 08/06/08 74
18 Wenig effiziente Lösung!! Besser ist es, die Berechnung von Minima und Maxima mit der Sortiertheitsprüfung zu verschränken. Idee: Entwickle eine Einbettung, die für sortierte Bäume auch Minimum und Maximum liefert. fun istsorteinbett (Blatt n) = (true,n,n) istsorteinbett (Zweig (n,l,r)) = let val (lerg,lmn,lmx) = istsorteinbett l val (rerg,rmn,rmx) = istsorteinbett r in ( lerg andalso rerg andalso end ; lmx<n andalso n<rmn, lmn, rmx ) fun istsortiert b = #1 (istsorteinbett b) Parametrische markierte Binärbaumtypen: 1. Alle Markierungen sind vom gleichen Typ: datatype a bbaum = Blatt of a Zweig of a * a bbaum * a bbaum 08/06/08 75
19 2. Blatt- und Zweigmarkierungen sind möglicherweise von unterschiedlichen Typen: datatype ( a, b) bbaum = Blatt of a Zweig of b * ( a, b) bbaum * ( a, b) bbaum Bäume mit variabler Kinderzahl: Bäume mit variabler Kinderzahl lassen sich realisieren: - durch mehrere Alternativen für Zweige (begrenzte Anzahl von Kindern) - durch Listen von Unterbäumen: datatype a baum = Kn of a * ( a baum list) fun zaehlekn (Kn (_,xs)) = Beachte: foldr op+ 1 (map zaehlekn xs) Der Rekursionsanfang ergibt sich durch Knoten mit leerer Unterbaumliste. 08/06/08 76
20 Bäume mit variabler Kinderzahl lassen sich z.b. zur Repräsentation von Syntaxbäumen verwenden, indem das Terminal- bzw. Nichtterminalsymbol als Markierung verwendet wird. Besser ist es allerdings, die Information über die Symbole mittels Konstruktoren auszudrücken. Dadurch gewinnt man an Typsicherheit (vgl. nächstes Beispiel). Verschränkte Datentypdeklarationen: Genau wie Funktionsdeklarationen werden verschränkt rekursive Datentypdeklarationen mit dem Schlüsselwort and verbunden: datatype <Typbezeichner1> = <Konstruktorbezeichner1_1> of <TypAusdruck1_1>... <Konstruktorbezeichner1_N> of <TypAusdruck1_N> and... and <TypbezeichnerM> = <KonstruktorbezeichnerM_1> of <TypAusdruckM_1>... <KonstruktorbezeichnerM_K> of <TypAusdruckM_K> 08/06/08 77
21 Beispiel: (verschränkte Datentypen) Der abstrakte Syntaxbaum eines Programms repräsentiert die Programmstruktur unter Verzicht auf Schlüsselworte und Trennzeichen. Rekursive Datentypen eignen sich sehr gut zur Beschreibung von abstrakter Syntax. Als Beispiel betrachten wir die abstrakte Syntax von Femto: datatype programm = Prog of wertdekl list * ausdruck and wertdekl = Dekl of string * ausdruck and ausdruck = Bzn of string Zahl of int Add of ausdruck * ausdruck Mul of ausdruck * ausdruck Das Programm val a = 73; ( a + 12 ) ; Wird durch folgenden Baum repräsentiert: Prog ( [Dekl ( a,zahl 73)], Add (Bzn a,zahl 12) ) Die Baumrepräsentation eignet sich besser als die Zeichenreihenrepräsentation zur weiteren Verarbeitung von Programmen. 08/06/08 78
22 Unendliche Datenobjekte: Eine nicht-leere Liste ist ein Wert, zu dem man sich das erste Element und eine Liste als Rest geben lassen kann. Hat die endliche Liste xl die Länge n>0, dann hat (tl xl) die Länge n-1. Eine unendliche Liste besitzt keine natürlichzahlige Länge und wird durch Anwendung von tl nicht kürzer. Unendliche Listen, häufig als Ströme (engl. stream) bezeichnet, sind die einfachsten unendlichen Daten- Objekte. In ML lassen sich unendliche Listen mit folgender Datenstruktur realisieren: datatype a stream = Nil Cons of a * ( unit -> a stream ) fun hd (Cons ( x, xf )) = x hd Nil = raise Empty fun tl (Cons ( x, xf )) = xf () tl Nil = raise Empty 08/06/08 79
23 Beispiel: (unendliche Liste) Liste aller (positiven) Dualzahlen dargestellt als Zeichenreichen: - fun incr (#"O"::xs) = #"L"::xs incr (#"L"::xs) = #"O":: incr xs incr [ ] = [ #"L" ] ; val incr = fn : char list -> char list - fun incrstr s = implode (rev (incr (rev (explode s)))); val incrstr = fn : string -> string - fun dualz_ab s = Cons (s, fn x=> dualz_ab (incrstr s)); val dualz_ab = fn: string -> string stream - val dl = dualz_ab "O" ; val dl = Cons ("O",fn) : string stream - hd dl; val it = "O" : string - val dl = tl dl; val dl = Cons ("L",fn) : string stream - val dl = tl dl; val dl = Cons ("LO",fn) : string stream 08/06/08 80
24 3.1.5 Felder/Arrays in ML Felder sind ein imperatives Sprachelement. Wir betrachten sie vor allem in Kapitel 4 und 5. Hier soll gezeigt werden, - wie imperative und funktionale Sprachkonstrukte zusammenwirken - wie Listen and Felder zusammenhängen Begriffsklärung: (Variable) Eine Speichervariable oder einfach nur Variable ist ein Speicher/Behälter für Werte. Charakteristische Operationen auf einer Variablen v: - Zuweisen eines Werts w an v; - Lesen des Wertes, den v enthält/speichert/hat. Der Zustand einer Variablen v ist undefiniert, wenn ihr noch kein Wert zugewiesen wurde; andernfalls ist der Zustand von v durch den gespeicherten Wert charakterisiert. Variablen stellen wir graphisch durch Rechtecke dar: v: true v1: 7 v enthält/speichert den Wert true v1 enthält/speichert den Wert 7 08/06/08 81
Weitere Operationen auf neu deklarierten Typen: Begriffsklärung: Weitere Anwendungen der datatype-deklaration: Beispiel: (Aufzählungstypen)
Begriffsklärung: Weitere Operationen auf neu deklarierten Typen: Konstruktorfunktionen oder Konstruktoren liefern Werte des neu definierten Datentyps. Sie können in Mustern verwendet werden (z.b.: Student,
Beispiele: (Funktionen auf Listen) (3) Bemerkungen: Die Datenstrukturen der Paare (2) Die Datenstrukturen der Paare
Beispiele: (Funktionen auf Listen) (3) Bemerkungen: 5. Zusammenhängen der Elemente einer Liste von Listen: concat :: [[a]] -> [a] concat xl = if null xl then [] else append (head xl) ( concat (tail xl))
Beschreibung von Werten: Beschreibung von Werten: (2) Begriffsklärung: (Ausdruck, expression) (2) Begriffsklärung: (Ausdruck, expression)
Beschreibung von Werten: Beschreibung von Werten: (2) mittels Konstanten oder Bezeichnern für Werte: 23 " Ich bin eine Zeichenreihe" True x durch direkte Anwendung von Funktionen: abs (-28382) "Urin" ++
Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 15 (Linearer Speicher, Listen, Bäume)
Fachrichtung 6.2 Informatik Universität des Saarlandes Tutorenteam der Vorlesung Programmierung 1 Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 15 (Linearer Speicher, Listen,
Beispiele: Funktionsabstraktion (3) Funktionsdeklaration. Funktionsdeklaration (2) Funktionsdeklaration (3) 3. Abstraktion über Funktionsbezeichner:
Beispiele: Funktionsabstraktion (3) Funktionsdeklaration 3. Abstraktion über Funktionsbezeichner: Ausdruck: f (f x) Abstraktion: \ f x -> f (f x) Mit Bezeichnervereinbarung: twice = \ f x -> f (f x) erg
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 =
Programmierung und Modellierung
Programmierung und Modellierung Benutzerdefinierte Datentypen Martin Wirsing in Zusammenarbeit mit Moritz Hammer SS 2009 2 Inhalt Kap. 7 Benutzerdefinierte Datentypen 1. Aufzählungstypen 2. Typen mit zusammengesetzten
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
1. Probeklausur zur Programmierung I
DEPENDABLE SYSTEMS AND SOFTWARE Fachrichtung 6.2 Informatik Tutoren der Vorlesung 1. Probeklausur zur Programmierung I Name: Matrikelnummer: Bitte öffnen Sie das Klausurheft erst dann, wenn Sie dazu aufgefordert
Aufgabe 1 Basiswissen zur Vorlesung (8 Punkte)
Matrikelnummer: 1 Aufgabe 1 Basiswissen zur Vorlesung (8 Punkte) Kreuzen Sie an, ob die folgenden Aussagen richtig oder falsch sind. Bewertung: keine Antwort: 0 Punkte richtige Antwort: +0.5 Punkte falsche
Objektorientierte Programmierung. Kapitel 22: Aufzählungstypen (Enumeration Types)
Stefan Brass: OOP (Java), 22. Aufzählungstypen 1/20 Objektorientierte Programmierung Kapitel 22: Aufzählungstypen (Enumeration Types) Stefan Brass Martin-Luther-Universität Halle-Wittenberg Wintersemester
Software Entwicklung 1
Software Entwicklung 1 Annette Bieniusa AG Softech FB Informatik TU Kaiserslautern Lernziele Die Definition wichtiger Begriffe im Zusammenhand mit Bäumen zu kennen. Markierte Bäumen, insbesondere Suchbäume,
Inhalt Kapitel 11: Formale Syntax und Semantik
Inhalt Kapitel 11: Formale Syntax und Semantik 1 Abstrakte und konkrete Syntax 2 Lexikalische Analyse 3 Formale Sprachen, Grammatiken, BNF 4 Syntaxanalyse konkret 266 Abstrakte und konkrete Syntax Abstrakte
Software Entwicklung 1
Software Entwicklung 1 Annette Bieniusa / Arnd Poetzsch-Heffter AG Softech FB Informatik TU Kaiserslautern Datenstruktur Liste Bieniusa/Poetzsch-Heffter Software Entwicklung 1 2/ 42 Formale Definition
Berechnungsschemata: Funktion als Parameter abstrahiert Operation im Schema, wird bei Aufruf des Schemas konkretisiert
6. Funktionen als Daten, Übersicht Orthogonales Typsystem: Funktionen sind beliebig mit anderen Typen kombinierbar Notation für Funktionswerte (Lambda-Ausdruck): fn (z,k) => z*k Datenstrukturen mit Funktionen
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
Funktionales Programmieren
Kapitel 3 3. Funktionales Programmieren 3.0 Übersicht 3. Funktionales Programmieren 3.0 Funktionales Programmieren 3. Funktionales Programmieren Grundkonzepte funktionaler Programmierung Zentrale Begriffe
13 Abstrakte Datentypen
13 Abstrakte Datentypen Bisher: Konkrete Datentypen Menge von Elementen Operationen auf den Elementen (Konstruktoren, Selektoren, Typprädikate) Eigenschaften abgeleitet Jetzt: Abstrakte Datentypen (ADT)
2.5 Listen. Kurzschreibweise: [42; 0; 16] Listen werden mithilfe von [] und :: konstruiert.
2.5 Listen Listen werden mithilfe von [] und :: konstruiert. Kurzschreibweise: [42; 0; 16] # let mt = [];; val mt : a list = [] # let l1 = 1::mt;; val l1 : int list = [1] # let l = [1;2;3];; val l : int
Datenstruktur Baum und Rekursion Software Entwicklung 1
Datenstruktur Baum und Rekursion Software Entwicklung 1 Annette Bieniusa, Mathias Weber, Peter Zeller 1 Datenstruktur Baum Bäume gehören zu den wichtigsten in der Informatik auftretenden Datenstrukturen.
Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 4 (Kapitel 4)
Fachrichtung 6.2 Informatik Universität des Saarlandes Tutorenteam der Vorlesung Programmierung 1 Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 4 (Kapitel 4) Hinweis: Dieses Übungsblatt enthält
Grundlagen der Programmierung 3 A
Grundlagen der Programmierung 3 A Typen, Typberechnung und Typcheck Prof. Dr. Manfred Schmidt-Schauß Sommersemester 2016 Haskell, Typen, und Typberechnung Ziele: Haskells Typisierung Typisierungs-Regeln
Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 11 (Parser II)
Fachrichtung 6.2 Informatik Universität des Saarlandes Tutorenteam der Vorlesung Programmierung 1 Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 11 (Parser II) Hinweis: Dieses
Übungsblatt 6: Softwareentwicklung I (WS 2006/07)
Prof. Dr. A. Poetzsch-Heffter Dipl.-Inform. J.O. Blech Dipl.-Inform. M.J. Gawkowski Dipl.-Inform. N. Rauch Technische Universität Kaiserslautern Fachbereich Informatik AG Softwaretechnik Übungsblatt 6:
Programmierung und Modellierung
Programmierung und Modellierung Terme, Suchbäume und Pattern Matching Martin Wirsing in Zusammenarbeit mit Moritz Hammer SS 2009 2 Inhalt Kap. 7 Benutzerdefinierte Datentypen 7. Binärer Suchbaum 8. Anwendung:
Verkettete Datenstrukturen: Bäume
Verkettete Datenstrukturen: Bäume 1 Graphen Gerichteter Graph: Menge von Knoten (= Elementen) + Menge von Kanten. Kante: Verbindung zwischen zwei Knoten k 1 k 2 = Paar von Knoten (k 1, k 2 ). Menge aller
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
Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 13 (Queues, Binary Search)
Fachrichtung 6.2 Informatik Universität des Saarlandes Tutorenteam der Vorlesung Programmierung 1 Programmierung 1 (Wintersemester 2015/16) Wiederholungstutorium Lösungsblatt 13 (Queues, Binary Search)
Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):
Was bisher geschah deklarative Programmierung funktional: Programm: Menge von Termgleichungen, Term Auswertung: Pattern matsching, Termumformungen logisch: Programm: Menge von Regeln (Horn-Formeln), Formel
Tag 7. Pattern Matching und eigene Datentypen
Tag 7 Pattern Matching und eigene Datentypen Heute werden wir eine Technik kennenlernen, die dafür sorgt, daß wir sehr viel übersichtlichere und kürzere Programme schreiben können. Als Überleitung auf
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
Programmierung und Modellierung
Programmierung und Modellierung Funktionen höherer Ordnung Martin Wirsing in Zusammenarbeit mit Moritz Hammer SS 2009 2 Inhalt Kap. 6 Funktionen höherer Ordnung 1. Funktionen als Parameter und Wert von
Klausur Programmierung WS 2002/03
Klausur Programmierung WS 2002/03 Prof. Dr. Gert Smolka, Dipl. Inf. Thorsten Brunklaus 14. Dezember 2002 Leo Schlau 45 Vor- und Nachname Sitz-Nr. 4711 007 Matrikelnummer Code Bitte öffnen Sie das Klausurheft
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
Lösungshinweise/-vorschläge zur Altklausur Abschlussklausur 06/07
Lösungshinweise/-vorschläge zur Altklausur Abschlussklausur 06/07 Dies sind die Lösungsvorschläge zu einer Altklausur, deren Aufgabenstellung an die Inhalte der Vorlesung Grundlagen der Programmierung
3 Einführung in ML. 3.1 Überblick. 3.2 Elementare Datentypen und Funktionen Bezeichner Elementare Datentypen
3 Einführung in ML 3.1 Überblick ML (Abk. für Meta Language) ist eine funktionale Programmiersprache, die Ende der 70er Jahre an der University of Edinburgh entwickelt und 1987 standardisiert wurde. Wir
Strukturelle Rekursion und Induktion
Kapitel 2 Strukturelle Rekursion und Induktion Rekursion ist eine konstruktive Technik für die Beschreibung unendlicher Mengen (und damit insbesondere für die Beschreibung unendliche Funktionen). Induktion
Kapitel 7: Benutzerdefinierte Datentypen
Kapitel 7: Benutzerdefinierte Datentypen Andreas Abel LFE Theoretische Informatik Institut für Informatik Ludwig-Maximilians-Universität München 10. Juni 2011 Quelle: Martin Wirsing, Benutzerdefinierte
Probeklausur Software-Entwicklung I
Prof. Dr. A. Poetzsch-Heter Dipl.-Inform. J. O. Blech Dipl.-Inform. M. J. Gawkowski Dipl.-Inform. N. Rauch Technische Universität Kaiserslautern Fachbereich Informatik AG Softwaretechnik Probeklausur Software-Entwicklung
9 Algebraische Datentypen
9 Algebraische Datentypen Dieses Kapitel erweitert Haskells Typsystem, das neben Basistypen (Integer, Float, Char, Bool,... ) und Typkonstruktoren ([ ] und ( )) auch algebraische Datentypen kennt. Ganz
Workshop Einführung in die Sprache Haskell
Workshop Einführung in die Sprache Haskell Nils Rexin, Marcellus Siegburg und Alexander Bau Fakultät für Informatik, Mathematik und Naturwissenschaften Hochschule für Technik, Wirtschaft und Kultur Leipzig
10 Abstrakte Datentypen
10 Abstrakte Datentypen abstrakte Datentypen generische Implementierung datengesteuerte Programmierung Operationstabelle 10.1 Abstrakte Datentypen Bisher: Konkrete Datentypen Menge von Elementen Operationen
1. Probeklausur Programmierung 1 (WS 2010/2011)
1. Probeklausur Programmierung 1 (WS 2010/2011) Team der Tutoren 11. Dezember 2010 Name Sitzplatz Matrikelnummer Bitte öffnen Sie das Klausurheft erst dann, wenn Sie dazu aufgefordert werden. Sie können
Dr. Lars Hildebrand Fakultät für Informatik Technische Universität Dortmund
EINI LW/WiMa Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 12/13 Dr. Lars Hildebrand Fakultät für Informatik Technische Universität Dortmund lars.hildebrand@tu-dortmund.de
Vorsicht bei redundanten und unvollständigen Matches!
Vorsicht bei redundanten und unvollständigen Matches! # let n = 7;; val n : int = 7 # match n with 0 -> "null";; Warning: this pattern-matching is not exhaustive. Here is an example of a value that is
EINI LW. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12
EINI LW Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 11/12 Fakultät für Informatik Technische Universität Dortmund lars.hildebrand@udo.edu http://ls1-www.cs.uni-dortmund.de
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
Fahrplan. Algebraische Datentypen. Inhalt. Der Allgemeine Fall: Algebraische Datentypen. Algebraische Datentypen: Nomenklatur
Fahrplan Teil I: Funktionale Programmierung im Kleinen Praktische Informatik 3: Funktionale Programmierung Vorlesung 3 vom 01112016: Algebraische Datentypen Christoph Lüth Universität Bremen Wintersemester
Allgemeine Hinweise: TECHNISCHE UNIVERSITÄT MÜNCHEN. Name Vorname Studiengang Matrikelnummer. Hörsaal Reihe Sitzplatz Unterschrift
TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Lehrstuhl für Sprachen und Beschreibungsstrukturen WS 2008/09 Einführung in die Informatik 2 Klausur Prof. Dr. Helmut Seidl, T. M. Gawlitza, S. Pott,
3. Funktionales Programmieren
3. Funktionales Programmieren Grundkonzepte funktionaler Programmierung Algorithmen auf Listen und Bäumen Abstraktion mittels Polymorphie und Funktionen höherer Ordnung Semantik, Testen und Verifikation
EINI LW/WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 16/17
EINI LW/WiMa Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 16/17 Dr. Lars Hildebrand Fakultät für Informatik Technische Universität Dortmund lars.hildebrand@tu-dortmund.de
Kapitel 12: Induktive
Kapitel 12: Induktive Datenstrukturen Felix Freiling Lehrstuhl für Praktische Informatik 1 Universität Mannheim Vorlesung Praktische Informatik I im Herbstsemester 2009 Folien nach einer Vorlage von H.-Peter
Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 7 (Kapitel 7)
Fachrichtung 6.2 Informatik Universität des Saarlandes Tutorenteam der Vorlesung Programmierung 1 Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 7 (Kapitel 7) Hinweis: Dieses Übungsblatt enthält
Software Entwicklung 1
Software Entwicklung 1 Annette Bieniusa / Arnd Poetzsch-Heffter AG Softech FB Informatik TU Kaiserslautern Fallstudie: Arithmetische Ausdrücke Bieniusa/Poetzsch-Heffter Software Entwicklung 1 2/ 33 Überblick
Einführung in die Informatik 2 9. Übung
Technische Universität München WS 2012/13 Institut für Informatik 11.11.2012 Prof. Tobias Nipkow, Ph.D. Abgabe: 18.12.2012, 15:30 Lars Noschinski, Dr. Jasmin Blanchette, Dmitriy Traytel Einführung in die
Frage, Fragen und nochmals Fragen
Frage, Fragen und nochmals Fragen Berthold Hoffmann Universität Bremen and DFKI Bremen hof@informatik.uni-bremen.de In diesem Text stehen einige Fragen, die man sich zu den Folien der Veranstaltung Funktionales
11 Fallstudie: Reguläre Ausdrücke
11 Fallstudie: Reguläre Ausdrücke Mit den bisher eingeführten Sprachelementen von Haskell lassen sich bereits substantielle Projekte realisieren. Dieses Kapitel 1 beschreibt einen algebraischen Datentyp
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........................................
Programmierung WS 2002 / 03: Musterlösung zum 12. Übungsblatt
U N S A R I V E R S A V I E I T A S N I S S Programmierung WS 2002 / 03: Musterlösung zum 12. Übungsblatt Prof. Dr. Gert Smolka, Dipl.-Inform. Thorsten Brunklaus Aufgabe 12.1: Syntaxbäume (10 = 2 + 2 +
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
Software Entwicklung 1. Fallstudie: Arithmetische Ausdrücke. Rekursive Klassen. Überblick. Annette Bieniusa / Arnd Poetzsch-Heffter
Software Entwicklung 1 Annette Bieniusa / Arnd Poetzsch-Heffter Fallstudie: Arithmetische Ausdrücke AG Softech FB Informatik TU Kaiserslautern Bieniusa/Poetzsch-Heffter Software Entwicklung 1 2/ 33 Überblick
Praktische Informatik 3: Funktionale Programmierung Vorlesung 3 vom : Algebraische Datentypen
16:01:59 2017-01-17 1 [35] Praktische Informatik 3: Funktionale Programmierung Vorlesung 3 vom 01.11.2016: Algebraische Datentypen Christoph Lüth Universität Bremen Wintersemester 2016/17 PI3 WS 16/17
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
Grundlegende Datentypen
Grundlegende Datentypen Funktionale Programmierung Prof. Dr. Oliver Braun Letzte Änderung: 22.10.2018 10:53 Grundlegende Datentypen 1/21 Typen in Haskell ist alles streng typisiert Haskell verfügt über
3. Funktionales Programmieren 3.2 Algorithmen auf Listen und Bäumen. Heapsort verfeinert die Idee des Sortierens durch Auswahl:
Heapsort 3. Funktionales Programmieren 3.2 Algorithmen auf Listen und Bäumen Heapsort verfeinert die Idee des Sortierens durch Auswahl: Minimum bzw. Maximum wird nicht durch lineare Suche gefunden, sondern
Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 1 (Kapitel 1)
Fachrichtung 6.2 Informatik Universität des Saarlandes Tutorenteam der Vorlesung Programmierung 1 Programmierung 1 (Wintersemester 2012/13) Lösungsblatt 1 (Kapitel 1) Hinweis: Dieses Übungsblatt enthält
Technische Universität München WS 2004/2005 Fakultät für Informatik 11. Dezember 2004 Prof. Dr. Seidl
Name: Vorname: Matr. Nr.: Technische Universität München WS 2004/2005 Fakultät für Informatik 11. Dezember 2004 Prof. Dr. Seidl Zwischenklausur zu Einführung in die Informatik I Hinweis: In dieser Zwischenklausur
Prüfung Funktionale Programmierung
Hochschule für angewandte Wissenschaften München Fakultät für Informatik und Mathematik Studiengruppe IF, IB, IC Sommersemester 2015 Prüfung Funktionale Programmierung Datum : 23.07.2015, 10:30 Uhr Bearbeitungszeit
4.1 Bäume, Datenstrukturen und Algorithmen. Zunächst führen wir Graphen ein. Die einfachste Vorstellung ist, dass ein Graph gegeben ist als
Kapitel 4 Bäume 4.1 Bäume, Datenstrukturen und Algorithmen Zunächst führen wir Graphen ein. Die einfachste Vorstellung ist, dass ein Graph gegeben ist als eine Menge von Knoten und eine Menge von zugehörigen
Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen
Kapitel 9 Programmierkurs Birgit Engels Anna Schulze Zentrum für Angewandte Informatik Köln Objektorientierte Programmierung Attribute von Klassen, Methoden und Variablen Interfaces WS 07/08 1/ 18 2/ 18
Funktionales Programmieren
3. Funktionales Programmieren 3.0 Kapitel 3 Funktionales Programmieren Arnd Poetzsch-Heffter TU Kaiserslautern 157 3. Funktionales Programmieren 3.0 Übersicht 3. Funktionales Programmieren Grundkonzepte
26 Hierarchisch strukturierte Daten
Algorithmik II Peter Wilke Sommersemester 2005 Teil III Funktionale Programmierung 26 Hierarchisch strukturierte Daten Peter Wilke Algorithmik II Sommersemester 2005 1 Peter Wilke Algorithmik II Sommersemester
Allgemeine Hinweise:
TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK WS 11/12 Einführung in die Informatik 2 Klausur Prof. Dr. Andrey Rybalchenko, M.Sc. Ruslán Ledesma Garza 11.02.2011 Name Vorname Studiengang Matrikelnummer
Binärbäume: Beispiel
Binärbäume Als Beispiel für eine interessantere dynamische Datenstruktur sehen wir uns jetzt Binärbäume an Ein Binärbaum wird rekursiv definiert: Er ist leer oder besteht aus einem Knoten (die Wurzel des
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
5.4 Arrays. Oft müssen viele Werte gleichen Typs gespeichert werden. Idee: Lege sie konsekutiv ab! Greife auf einzelne Werte über ihren Index zu!
5.4 Arrays Oft müssen viele Werte gleichen Typs gespeichert werden. Idee: Lege sie konsekutiv ab! Greife auf einzelne Werte über ihren Index zu! Feld: Index: 17 3-2 9 0 1 0 1 2 3 4 5 Harald Räcke 114/656
1. Probeklausur (Lösung) zu Programmierung 1 (WS 07/08)
Fachschaft Informatikstudiengänge Fachrichtung 6.2 Informatik Das Team der Bremser 1. Probeklausur (Lösung) zu Programmierung 1 (WS 07/08) http://fsinfo.cs.uni-sb.de Name Matrikelnummer Bitte öffnen Sie
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........................................
Programmierung 1 (Wintersemester 2015/16) Lösungsblatt: Aufgaben für die Übungsgruppen: 12 (Kapitel 13)
Fachrichtung 6.2 Informatik Universität des Saarlandes Tutorenteam der Vorlesung Programmierung 1 Programmierung 1 (Wintersemester 2015/16) Lösungsblatt: Aufgaben für die Übungsgruppen: 12 (Kapitel 13)
Definition: (Kette, noethersche Ordnung) Definition: (Kette, noethersche Ordnung) (2) Lemma: Terminierungskriterium:
Definition: (Kette, noethersche Ordnung) Definition: (Kette, noethersche Ordnung) (2) Sei (M, ) eine Ordnung. Eine Folge ϕ : N M heißt eine (abzählbar unendliche) aufsteigende Kette, wenn für alle i N
1 Der Baum. Informatik I: Einführung in die Programmierung 11. Bäume. Bäume in der Informatik. Bäume in der Informatik - Definition.
1 Informatik I: Einführung in die Programmierung 11. Bäume e e Albert-Ludwigs-Universität Freiburg Bernhard Nebel 13. November 2015 13. November 2015 B. Nebel Info I 3 / 33 Bäume in der Informatik Bäume
Informatik. Pointer (Dynamisch) Vorlesung. 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1
Informatik Vorlesung 08 Pointer (Dynamisch) 17. Dezember 2018 SoSe 2018 FB Ing - SB Umwelttechnik und Dienstleistung - Informatik Thomas Hoch 1 Pointer (Zeiger) Dynam. Speicher Bisher: Speicherbedarf muss
Grundlegende Datentypen
Grundlegende Datentypen (Funktionale Programmierung) Prof. Dr. Oliver Braun Letzte Änderung: 18.03.2018 21:08 Grundlegende Datentypen 1/16 Typen in Haskell ist alles streng typisiert Haskell verfügt über
mathematik und informatik
Prof. Dr. Martin Erwig Kurs 01852 Fortgeschrittene Konzepte funktionaler Programmierung LESEPROBE mathematik und informatik Das Werk ist urheberrechtlich geschützt. Die dadurch begründeten Rechte, insbesondere
Kapitel 6. Konstruktortypen und Ausnahmen. 6.1 Varianten und Konstruktoren
Kapitel 6 Konstruktortypen und Ausnahmen Wir lernen jetzt, wie man mithilfe von Konstruktoren neue Typen deklariert. Mit Konstruktortypen lassen sich Mengen von geordneten Bäumen beschreiben. Außerdem
Übergang von funktionaler zu OOP. Algorithmen und Datenstrukturen II 1
Übergang von funktionaler zu OOP Algorithmen und Datenstrukturen II 1 Imperative vs. funktionale Programmierung Plakativ lassen sich folgende Aussagen treffen: funktional: imperativ: Berechnung von Werten
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 12/13. Kapitel 3. Grunddatentypen, Ausdrücke und Variable
1 Kapitel 3 Grunddatentypen, Ausdrücke und Variable 2 Eine Datenstruktur besteht aus Grunddatentypen in Java einer Menge von Daten (Werten) charakteristischen Operationen Datenstrukturen werden mit einem
Funktionale Programmierung mit ML
Funktionale Programmierung mit ML Logische und funktionale Programmierung - Universität Potsdam - M. Thomas - Funkt. Programmierung mit ML - X.1 Wichtigsten Eigenschaften von SML funktionale Programmiersprache
Bemerkung: Heapsort. Begriffsklärung: (zu Bäumen) Begriffsklärung: (zu Bäumen) (2) Heapsort verfeinert die Idee des Sortierens durch Auswahl:
Heapsort Bemerkung: Heapsort verfeinert die Idee des Sortierens durch Auswahl: Minimum bzw. Maximum wird nicht durch lineare Suche gefunden, sondern mit logarithmischem Aufwand durch Verwendung einer besonderen
Prüfung Funktionale Programmierung
Hochschule für angewandte Wissenschaften München Fakultät für Informatik und Mathematik Studiengruppe IF, IB, IC Sommersemester 2014 Prüfung Funktionale Programmierung Datum : 16.07.2014, 12:30 Uhr Bearbeitungszeit
Polymorphie und Funktionen höherer Ordnung
Abschnitt 3.3 3. Funktionales Programmieren 3.3 Polymorphie und Funktionen höherer Ordnung Polymorphie und Funktionen höherer Ordnung Arnd Poetzsch-Heffter TU Kaiserslautern 405 3. Funktionales Programmieren
Lösungen zum Übungsblatt 3: Softwareentwicklung I (WS 2006/07)
Prof. Dr. A. Poetzsch-Heffter Dipl.-Inform. J.O. Blech Dipl.-Inform. M.J. Gawkowski Dipl.-Inform. N. Rauch Technische Universität Kaiserslautern Fachbereich Informatik AG Softwaretechnik Lösungen zum Übungsblatt
Paradigmen der Programmierung
SS 11 Prüfungsklausur 25.07.2011 Aufgabe 5 (6+9 = 15 Punkte) a) Bestimmen Sie jeweils den Typ der folgenden Haskell-Ausdrücke: ( 1, 2 :"3", 4 < 5) :: (Char, String, Bool) [(last, tail), (head, take 5)]
Fallstudie: Nim Spiel
Fallstudie: Nim Spiel Angeblich chinesischen Ursprungs (Jianshizi) Interessant für Spieltheorie: vollständig analysierbar Frühzeitig computerisiert 1939 Nimatron (Weltausstellung New York) 1951 Nimrod
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
ALP I. Funktionale Programmierung
ALP I Funktionale Programmierung Zusammengesetzte Datentypen in Haskell WS 2012/2013 Zusammengesetzte Datentypen Tupel List String Zusammengesetzte Datentypen Tupel-Datentyp Ein Tupel ist eine Ansammlung