Algebraische Datentypen
|
|
|
- Kornelius Schmidt
- vor 9 Jahren
- Abrufe
Transkript
1 5 Algebraische Datentypen Wir haben in früheren Kapiteln schon gesehen, dass in einer funktionalen Sprache alle zusammengesetzten Datentypen wie Tupel, Listen und Bäume algebraische Datentypen sind. In diesem Kapitel werden wir die verschiedenen Arten von algebraischen Datentypen Aufzählungstypen, Produkttypen, Summentypen mit und ohne Rekursion genauer ansehen. 5.1 Aufzählungstypen In vielen Programmiersprachen können Aufzählungen von Werten als Datentypen definiert werden, z.b. die Wochentage als die Menge Weekday = {Mo,Tu,We,Th,Fr,Sa,Su} Die Werte von Aufzählungen werden häufig als implizit definierte ganzzahlige Konstanten betrachtet, z.b.: Mo = 0,Tu = 1,We = 2,Th = 3,Fr = 4,Sa = 5,Su = 6 Machen wir uns schnell klar, dass die Typesynonyme von Haskell nicht geeignet sind, um Aufzählungstypen zu realisieren. Zwar könnte man definieren type Weekday = Int und auch die oben genannten Konstanten einführen, doch böte dies keinerlei Typsicherheit: Typsynonyme sind nur Abkürzungen, die wie Makros expandiert und dann vergessen werden. Die Wochentage sind also ganz gewöhnliche ganzzahlige Konstanten, die wie jeder andere Zahlenwert behandelt werden können. Die Ausdrücke Fr +15 und Fr Mo wären also zulässig, obwohl die Addition keinen Wochentag liefert und Multiplikation auf Wochentagen keinen Sinn macht.
2 70 5. Algebraische Datentypen Wir brauchen aber einen Datentyp, der nur Wochentage Mo,Tu,...,Su als Werte enthält und sonst nichts, und wir wollen für diesen Typ nur Funktionen zulassen, die Sinn machen, und sonst keine. Wichtig ist, dass alle Wochentage unterschiedlich sind und nicht mit Werten anderer Datentypen verwechselt werden können. Das heißt, wir wollen Datenabstraktion betreiben. Dies können wir mit der einfachsten Art von algebraischem Datentyp erreichen, dem Aufzählungstyp: data Weekday = Mo Tu We Th Fr Sa Su Mit dem Typ Weekday werden zugleich automatisch die Konstruktoren definiert: Mo, Tu, We, Th, Fr, Sa, Su :: Weekday, So, wie er hier definiert wurde, sind für den Typ Weekday keine weiteren Operationen vordefiniert. Funktionen können durch pattern matching definiert werden: isweekend :: Weekday Bool isweekend Sa = True isweekend Su = True isweekend _ = False Sicher gäbe es einige Operationen, die Sinn machten: Wochentage könnten verglichen, geordnet, als Zeichenkette gedruckt oder aus einer Zeichenkette gelesen werden, sie sind aufzählbar und beschränkt (in ihrer Wertemenge). Man könnte Weekday damit zu einer Instanz der Klassen Eq, Ord, Show, Read und Bounded machen und die entsprechenden Operationen für Wochentage definieren. Gleichheit und Ungleichheit lässt sich durch Mustervergleich realisieren. Als Ordnung nimmt man die Reihenfolge der Konstruktoren in der Typdefinition, in diesem Fall also Mo < Tu < We < Th < Fr < Sa < Su. Die Namen der Konstruktoren bilden ihre Darstellung als Zeichenkette, also Mo... Su, die von show ausgegeben bzw. von read gelesen wird. Die Funktionen succ und pred der Klasse Enum können aus der Ordnung der Konstruktoren abgeleitet werden, so dass dann Listen-Generatoren wie [Mo..Fr] oder [Mo,We..Su] gebildet werden können. Die Konstanten der Klasse Bounded können definiert werden als minbound = Mo und maxbound = Su. Für den algebraischen Typ Weekday kann man eine kanonische Instanz dieser Klassen auch automatisch aus der Typdefinition herleiten. Dies kann man in Haskell so spezifizieren: data Weekday = Mo Tu We Th Fr Sa Su deriving (Eq, Ord, Show, Read, Enum, Bounded)
3 5.2. Produkttypen 71 Dann könnte die Funktion isworkday auch implementiert werden mithilfe der Funktion elem::(eq a) a [a] Bool und des Listengenerators.., der nur für Instanzen von Enum definiert ist: isworkday :: Weekday Bool isworkday d = d elem [Mo.. Fr] 5.2 Produkttypen Das kartesische Produkt fasst mehrere Werte zu einem einzigen zusammen: P = T 1 T k (k 2) In Haskell sind Produkttypen als Tupeltypen vordefiniert. Man könnte also schreiben: type P = (T 1,, T k ) Beispiel 5.1 (Koordinaten und komplexe Zahlen). Koordinaten in der Ebene und komplexe Zahlen können definiert werden als type Point = (Double,Double) type Complex = (Double,Double) Typdefinitionen führen jedoch nur Abkürzungen für Typausdrücke ein, die Typen von Werten p:: Point, c:: Complex und x::(double,double) können nicht unterschieden werden; es darf also jeder für den anderen eingesetzt werden. Will man unterschiedliche Typen mit disjunkten Wertemenge definieren, muss man schreiben data Point = Point Double Double data Complex = Complex Double Double Werte dieser Typen werden als p= Point bzw. c= Complex geschrieben und können wegen der vorangestellten Konstruktoren Point :: Double Double Point Complex :: Double Double Complex nicht mit einander verwechselt werden. In Haskell besteht die Konvention, für den einzigen (Wert-) Konstruktor eines Produkttyps denselben Namen zu verwenden wie für den Typ (-Konstruktor) selber. Das ist nur auf den ersten Blick verwirrend. Beispiel 5.2 (Datum). Ein Datum besteht aus Tag, Monat, und Jahr. Wir könnten es als Tupeltyp definieren:
4 72 5. Algebraische Datentypen type Date = (Day, Month, Year) type Day = Int data Month = Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec deriving (Eq, Ord, Show, Read, Enum, Bounded) type Year = Int Damit hätten wir die ähnliche Probleme wie mit der Darstellung von Koordinaten und komplexen Zahlen: Werte jedes anderen Tupeltyps, der aus denselben Komponenten besteht, könnten mit den Werten von Date verwechselt werden. Deshalb ist es besser, ein Datum als algebraischen Datentyp mit einem Konstruktor zu definieren: data Date = Date Year Month Day deriving (Eq, Ord, Show, Read, Bounded) Für den Typ Date wird wieder automatisch der Konstruktor definiert, nur ist es in diesem Fall eine dreistellige Funktion: Date :: Year Month Day Date Wie bei den Wochentagen können wir Date als kanonische Instanz der Klassen Eq, Ord, Show, Read und Bounded ableiten lassen, da der in Date benutzte Typ (Int) ebenfalls Instanz dieser Klassen ist. Da bei der Ableitung der Vergleichsoperationen die lexikographische Ordnung verwendet wird, in der zunächst die ersten Komponenten verglichen werden und, wenn die gleich sind, die weiteren, haben wir die Reihenfolge der Komponenten umgedreht, so dass die Ordnung Sinn macht. Beispielwerte vom Typ Date können jetzt anhand des Konstruktors von allen anderen Tupeltypen und Produkttypen mit anderen Konstruktornamen unterschieden werden: today, bloomsday, fstday :: Date today = Date 2009 Nov 25 bloomsday = Date 1904 Jun 16 fstday = Date 1 Jan 1 Funktionen für Datum können mit Mustervergleich definiert werden. Damit kann auf die Komponenten des Datums zugegriffen werden. day :: Date Day day (Date y m d) = d year :: Date Year year (Date y m d) = y Der Mustervergleich kann für einen Produkttyp wie Date nie scheitern. Man braucht also jeweils nur eine Gleichung für die Definition. Die oben definierten Funktionen day, year sind Selektoren: day today = 26 year bloomsday = 1904
5 5.3. Summentypen 73 Ein Spezialfall von Produkten sind die homogenen Produkte, die aus k Komponenten des gleichen Typs bestehen. Mathematisch werden sie oft so geschrieben: P = T k (k 2) Hierbei kann man sich fragen, weshalb k größer als 1 sein muss. Eintupel definieren sicher keinen sinnvollen neuen Typ; deshalb werden Klammern ohne Kommata dazwischen auch einfach nur zur syntaktischen Gruppierung in Ausdrücken verwendet. Aber was ist mit dem Fall k = 0? Das Nulltupel () definiert den Einheitstyp, der nur einen einzigen Wert enthält, der genau wie der Typ selbst mit () bezeichnet wird. Dieser Typ kann genau wie der Typ void in Java überall da eingesetzt werden, wo ein Typ hingeschrieben werden muss, aber kein interessanter Wert erwartet wird. Wir werden später sehen, dass es auch in Haskell solche Situationen gibt. 5.3 Summentypen Summentypen setzen Wertemengen als disjunkte Vereinigung andere Wertemengen zusammen: S = T T k (k 2) Hierbei können die T i wieder zusammengesetzte Typen, insbesondere Produkttypen sein. Summentypen können als algebraischen Datentypen mit mehreren Konstruktoren definiert werden, wobei die Konstruktoren mehrstellig sein können. Beispiel 5.3 (Geometrische Figuren). Eine geometrische Figur soll sein: entweder ein Kreis, gegeben durch Mittelpunkt und Durchmesser, oder ein Rechteck, gegeben durch zwei Eckpunkte, oder ein Polygon, gegeben durch die Liste seiner Eckpunkte. Geometrische Figuren können so definiert werden: type Point = (Double, Double) data Shape = Circ Point Double Rect Point Point Poly [Point] deriving (Eq,Show,Read) Für jede Art von Figur gibt es einen eigenen Konstruktor: Circ :: Point Double Shape Rect :: Point Point Shape Poly :: [Point] Shape
6 74 5. Algebraische Datentypen Funktionen werden wieder durch pattern matching definiert. Die Funktion corners berechnet beispielsweise die Anzahl der Eckpunkte. corners :: Shape Int corners (Circ ) = 0 corners (Rect ) = 4 corners (Poly ps) = length ps Die Translation eines Punktes wird durch Addition berechnet. translation :: Point Point Point translation (x, y) (dx, dy) = (x+ dx, y+ dy) Damit kann die Verschiebung einer Figur so definiert werden: move :: Shape Point Shape move (Circ c r) dp = Circ (translation c dp) r move (Rect c1 c2) dp = Rect (translation c1 dp) (translation c2 dp) move (Poly ps) dp = Poly [ translation p dp p ps ] Die Berechnung der Fläche ist für Kreise und Rechtecke einfach. Für Polygone beschränken wir uns aus Bequemlichkeit halber auf konvexe Polygone, und reduzieren die Berechnung durch Abspalten eines Teildreiecks rekursiv auf die Flächenberechnung eines einfacheren Polygons: area :: Shape Double area (Circ _ d) = pi d area (Rect (x1, y1) (x2, y2)) = abs ((x2- x1) (y2- y1)) area (Poly ps) length ps < 3 = 0 area (Poly (p1:p2:p3:ps)) = triarea p1 p2 p3 + area (Poly (p1:p3:ps)) Dabei ergibt sich die Fläche eines Dreieck mit den Eckpunkten (x 1, y 1 ), (x 2, y 1 ), (x 3, y 3 ) als A = (x 2 x 1 )(y 3 y 1 ) (x 3 x 1 )(y 2 y 1 ) 2 Kodiert in Haskell sieht das so aus:
7 triarea :: Point Point Point Double triarea (x1,y1) (x2,y2) (x3, y3) = abs ((x2-x1) (y3-y1) - (x3-x1) (y2-y1)) / Summentypen 75 Die Distanz zwischen zwei Punkten ist nach Pythagoras so definiert: y1 dist (x1, y1) (x2, y2) y2 x1 x2 dist :: Point Point Double dist (x1, y1) (x2, y2) = sqrt((x1-x2)^2+ (y2- y1)^2) Algebraische Datentypen können auch mit einer Typvariablen parametrisiert sein. Weiter unten werden wir Bäume als ein Beispiel für solche Typen betrachten. Hier wollen wir nur kurz einen vordefinierten Typ erwähnen, mit dem Fehler behandelt werden können. Beispiel 5.4 (Maybe). Beim Programmieren kommt man oft in die Verlegenheit, dass eine Funktion in bestimmten Fehlersituationen keine gültige Ergebnisse ihres Ergebnistyps α liefern kann. Betrachten wir eine Funktion lookup, die in einer Paarliste den Eintrag für einen Schlüssel sucht. lookup :: Eq a a [(a,b)] b lookup k [] =...?? lookup k ((k,e):xs) k == k = e otherwise = lookup k xs Welchen Wert soll sie liefern, wenn der Schlüssel in der Liste gar nicht auftaucht? Man könnte irgendeinen Wert von b als den Fehlerwert vereinbaren; das wäre aber nicht sehr sauber programmiert. Besser wäre es, den Ergebnistyp b um einen Fehlerwert zu erweitern. Dies kann man für beliebige Typen mithilfe des parametrisierten Summentyps Maybe tun, der in Haskell folgendermaßen vordefiniert ist data Maybe a = Nothing Just a deriving (Eq, Ord, Read, Show) Nothing repräsentiert den Fehlerwert, und der Konstruktor Just kennzeichnet die richtigen Werte. Dann können wir die Funktion so definieren:
8 76 5. Algebraische Datentypen lookup :: Eq a a [(a,b)] Maybe b lookup k [] = Nothing lookup k ((k,e):xs) k == k = Just e otherwise = lookup k xs Brauchen wir aber nicht, denn sie ist vordefiniert. Der parametrisierte Summentyp schlechthin ist der vordefinierte Typ Either a b, der entweder Werte des Typs a oder des Typs b enthält. data Either a b = Left a Right b deriving (Eq,Ord,Read,Show) 5.4 Rekursive algebraische Datentypen In Summentypen kann der definierte Typ auf der rechten Seite benutzt werden; dann ist der Datentyp rekursiv. Funktionen auf solchen Typen sind meist auch rekursiv. (Rekursive Produkttypen machen dagegen keinen Sinn, weil es dann keinen Konstruktor gäbe, der einen Anfangswert erzeugen könnte.) Beispiel 5.5 (Arithmetische Ausdrücke). Einfache arithmetische Ausdrücke bestehen entweder aus Zahlen (Literalen), oder aus der Addition bwz. der Subtraktion zweier Ausdrücke. data Expr = Lit Int Add Expr Expr Sub Expr Expr deriving (Eq,Read,Show) Betrachten wir Funktionen zum Auswerten und Drucken eines Ausdrucks: eval :: Expr Int eval (Lit n)= n eval (Add e1 e2) = eval e1+ eval e2 eval (Sub e1 e2) = eval e1- eval e2 print :: Expr String print (Lit n) = show n print (Add e1 e2) = "("++ print e1++ "+"++ print e2++ ")" print (Sub e1 e2) = "("++ print e1++ "-"++ print e2++ ")" An diesen Beispielen können wir ein Prinzip der primitive Rekursion auf Ausdrücken erkennen, das der primitiven Rekursion aus Listen entspricht, die wir in Abschnitt entdeckt haben. Primitiv rekursive Funktionen über Ausdrücken definieren eine Gleichung für jeden Konstruktor: Für Literale, die Rekursionsverankerung, wird ein Wert eingesetzt.
9 5.5. Bäume 77 Für die rekursiven Fälle, Addition, bzw. Subtraktion, werden jeweils binäre Funktionen eingesetzt. Kombinatoren wie map und fold machen nicht nur Sinn für Listen. Sie können für viele algebraische Datentypen definiert werden, insbesondere wenn sie rekursiv sind. Beispiel 5.6 (Strukturelle Rekursion über Ausdrücken). In Beispiel 5.5 haben wir ein Prinzip der primitiven Rekursion über Ausdrücken entdeckt, dass wir jetzt in einem Kombinator kapseln können. Für jeden Wertkonstruktor des Typs Expr müssen wir beim Falten eine Funktion entsprechenden Typs angeben: data Expr = Lit Int Add Expr Expr Sub Expr Expr deriving (Eq,Read,Show) folde :: (Int a) (a a a) (a a a) Expr a folde b a s (Lit n) = b n folde b a s (Add e1 e2) = a (folde b a s e1) (folde b a s e2) folde b a s (Sub e1 e2) = s (folde b a s e1) (folde b a s e2) Damit kann die Auswertung und die Ausgabe so definiert werden: eval :: Expr Int print :: Expr String eval = folde id (+) (-) print = folde show (\s1 s2 "("++ s1++ "+"++ s2++ ")") (\s1 s2 "("++ s1++ "-"++ s2++ ")") 5.5 Bäume Bäume sind der rekursive algebraische Datentyp schlechthin. Ein binärer Baum ist hier entweder leer, oder ein Knoten mit genau zwei Unterbäumen, wobei die Knoten Markierungen tragen. data Tree a = Null Node (Tree a) a (Tree a) deriving (Eq, Read, Show) Einen Test auf Enthaltensein kann man wie gewohnt mit Mustervergleich definieren:
10 78 5. Algebraische Datentypen member :: Eq a Tree a a Bool member Null _ = False member (Node l a r) b = a == b (member l b) (member r b) Diese Funktion benutzt ein Schema für primitive Rekursion auf Bäumen: Der leere Baum bildet den Rekursionsanfang; dann wird ein Wert zurückgeliefert. Im Rekursionsschritt wird für jeden Knoten aus seiner Markierung und den rekursiv bestimmten Werten für die Unterbäume der Rückgabewert berechnet. Auf die gleiche Weise können wir Funktionen zum Traversieren von Bäumen definieren, die alle Markierungen in einer Liste zusammenfassen: preorder, inorder, postorder :: Tree a [a] preorder Null = [] preorder (Node l a r) = [a] ++preorder l ++preorder r inorder Null = [] inorder (Node l a r) = inorder l ++[a] ++inorder r postorder Null = [] postorder (Node l a r) = postorder l ++postorder r++ [a] Auch für Bäume können Kombinatoren definiert und benutzt werden. Beispiel 5.7 (Strukturelle Rekursion auf Bäumen). Der Kombinator foldt kapselt Rekursion auf Bäumen. foldt :: (a b b b) b Tree a b foldt f e Null = e foldt f e (Node l a r) = f a (foldt f e l) (foldt f e r) Damit kann der Elementtest und eine map-funktion für Bäume realisiert werden. member :: Eq a Tree a a Bool member t x = foldt (\e b1 b2 e == x b1 b2) False t mapt :: (a b) Tree a Tree b mapt f = foldt (flip Node f) Null Dabei ist flip die vordefinierte Funktion, die zwei Argumente eine Funktion vertauscht. Traversierung kann dann so beschrieben werden: preorder, inorder, postorder :: Tree a [a] preorder = foldt (\x t1 t2 [x] ++ t1 ++ t2 ) [] inorder = foldt (\x t1 t2 t1 ++ [x] ++ t2 ) [] postorder = foldt (\x t1 t2 t1 ++ t2 ++ [x]) []
11 5.5. Bäume 79 Beispiel 5.8 (geordnete Bäume). Bäume können dazu benutzt werden, Mengen effizient darzustellen. Eine Voraussetzung dafür ist, dass die Elemente der Menge geordnet sind, d.h. in der Terminologie von Haskell, dass ihr Elementtyp a eine Instanz der Klasse Ord sein muss. Für alle Knoten Node a l r eines geordneten Baum soll gelten, dass der linke Unterbaum nur kleinere und der rechte Unterbaum nur größere Elemente als a enthält: member x l x < a member x r a < x Eine Konsequenz dieser Bedingung ist, dass jeder Eintrag höchstens einmal im Baum vorkommt. Der Test auf Enthaltensein lässt sich dann so vereinfachen: member :: Ord a Tree a a Bool member Null _ = False member (Node l a r) b b < a = member l b a == b = True b > a = member r b Die Funktion für ordnungserhaltendes Einfügen kann dann so definiert werden: insert :: Ord a Tree a a Tree a insert Null a = Node Null a Null insert (Node l a r) b b < a = Node (insert l b) a r b == a = Node l a r b > a = Node l a (insert r b) Etwas komplizierter ist das Löschen eines Elements: delete :: Ord a a Tree a Tree a delete x Null = Null delete x (Node l y r) x < y = Node (delete x l) y r x == y = join l r x > y = Node l y (delete x r) Sei beispielsweise folgender Baum gegeben:
12 80 5. Algebraische Datentypen Wenn wir danach delete t 9 ausführen, wird die Wurzel von t gelöscht, und die beiden Unterbäume müssen von join ordnungserhaltend zusammengefügt werden: Dabei wird der Knoten links unten im rechten Teilbaum (oder der rechts unten im linken Teilbaum) die Wurzel des neuen Baums. Wir implementieren dazu eine Funktion splittree, die den Baum in den Knoten links unten und den Rest aufspaltet. join :: Tree a Tree a Tree a join xt Null = xt join xt yt = Node xt u nu where (u, nu) = splittree yt splittree :: Tree a (a, Tree a) splittree (Node Null a t) = (a, t) splittree (Node lt a rt) = (u, Node nu a rt) where (u, nu) = splittree lt Dabei nehmen wir an, dass xt nicht leer ist, wenn yt nicht leer ist. 5.6 Zusammenfassung Die Definition eines algebraischen Datetypen T α 1 α k hat im Allgemeinen folgende Form: data T α 1 α k = K 1 Typ 1,1...Typ 1,k1. K n Typ n,1...typ n,kn deriving (C 1,..., C n ) Hierin sind die Typ i,j Typausdrücke, in denen die Typvariablen α 1 α k und auch T vorkommen dürfen. Die Konstruktorfunktionen K i :: Typ i,1... Typ i,ki T α 1 α k sind verschieden von einander (und verschieden von allen anderen Konstruktoren algebraischer Datentypen). Algebraische Datentypen haben drei wichtige Eigenschaften:
13 5.6. Zusammenfassung Die Konstruktoren sind total: Jede Anwendung eines Konstruktors auf Argumente geeigneten Typs liefert einen Wert. 2. Sie sind Konstruktor-erzeugt: Ihre Werte können ausschließlich durch die (verschachtelte) Anwendung von Konstruktoren aufgebaut werden. 3. Die Werte sind frei erzeugt: Für verschiedene Argumente liefert die Anwendung eines Konstruktors immer auch verschiedene Werte. Beispiel 5.9 (Nochmal Bäume). Für den Datentyp Tree a folgert aus den oben definierten Eigenschaften: 1. Für alle Werte v vom Typ a und alle Bäume vom l, r vom Typ Tree a ist t = Node v l r ein Baum (von Typ Tree a). 2. Jeder Baum t :: Tree a hat entweder die Form t = Null oder die Form t = Node v l r, wobei v ein Wert vom Typ a und l, r Bäume vom Typ Tree a sind. 3. Für Werte t = Node v l r und t = Node v l r mit (v, l, r) (v, l, r ) gilt auch t t. (Umgekehrt folgt aus t = t, dass (v, l, r) = (v, l, r ).) Die erste Eigenschaft macht uns Probleme, wenn wir geordnete Bäume implementieren wollen. Mit den Konstruktoren können jederzeit beliebige, also auch ungeordnete Bäume erzeugt werden. Um die Ordnung zu erhalten, müssten die Konstruktoren Null und Node verborgen werden, und alleine insert als Pseudo-Konstruktor benutzbar sein. Diese Operation ist total, erzeugt die geordneten Bäume aber nicht frei, denn insert (insert t x) x = insert t x Im nächsten Kapitel werden wir sehen, wie geordnete Bäume als abstrakte Datentypen genau so realisiert werden können. (Dies ist Fassung von 24. November 2009.)
14 82 5. Algebraische Datentypen
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
expr :: Expr expr = Mul (Add (Const 3) (Const 4)) (Div (Sub (Const 73) (Const 37)) (Const 6))
1 - Korrektur 2 - Abstrakte Datentypen für arithmetische Ausdrücke Der Datentyp Wir beginnen zunächst mit dem algebraischen Datentyp für Ausdrücke. Hierfür definieren wir einen Konstruktor Number für Zahlen,
Zahlen in Haskell Kapitel 3
Einführung in die Funktionale Programmiersprache Haskell Zahlen in Haskell Kapitel 3 FH Wedel IT-Seminar: WS 2003/04 Dozent: Prof. Dr. Schmidt Autor: Timo Wlecke (wi3309) Vortrag am: 04.11.2003 - Kapitel
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))
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
Programmieren in Haskell
Programmieren in Haskell Syntax und Semantik von Haskell Programmieren in Haskell 1 Was wir heute (und nächstes mal) machen Datentypdefinitionen Wertdefinitionen, Variablenbindungen Musterbindungen Funktionsbindungen
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
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
4. Jeder Knoten hat höchstens zwei Kinder, ein linkes und ein rechtes.
Binäre Bäume Definition: Ein binärer Baum T besteht aus einer Menge von Knoten, die durch eine Vater-Kind-Beziehung wie folgt strukturiert ist: 1. Es gibt genau einen hervorgehobenen Knoten r T, die Wurzel
368 4 Algorithmen und Datenstrukturen
Kap04.fm Seite 368 Dienstag, 7. September 2010 1:51 13 368 4 Algorithmen und Datenstrukturen Java-Klassen Die ist die Klasse Object, ein Pfeil von Klasse A nach Klasse B bedeutet Bextends A, d.h. B ist
Funktionale Programmierung mit Haskell
Funktionale Programmierung mit Haskell Prof. Dr. Hans J. Schneider Lehrstuhl für Programmiersprachen und Programmiermethodik Friedrich-Alexander-Universität Erlangen-Nürnberg Sommersemester 2011 I. Die
Lernziele: Ausgleichstechniken für binäre Bäume verstehen und einsetzen können.
6. Bäume Lernziele 6. Bäume Lernziele: Definition und Eigenschaften binärer Bäume kennen, Traversierungsalgorithmen für binäre Bäume implementieren können, die Bedeutung von Suchbäumen für die effiziente
Funktionale Programmierung mit Haskell
Funktionale Programmierung mit Haskell Dr. Michael Savorić Hohenstaufen-Gymnasium (HSG) Kaiserslautern Version 20120622 Überblick Wichtige Eigenschaften Einführungsbeispiele Listenerzeugung und Beispiel
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:
Funktionale Programmierung. der direkte Weg vom Modell zum Programm
1 Funktionale Programmierung der direkte Weg vom Modell zum Programm Peter Padawitz, TU Dortmund 19. Juni 2010 2 Inhalt Modelle Bestandteile eines Modells Konstruktor- versus destruktorbasierte Modelle
Grundlagen der Informatik. Prof. Dr. Stefan Enderle NTA Isny
Grundlagen der Informatik Prof. Dr. Stefan Enderle NTA Isny 2 Datenstrukturen 2.1 Einführung Syntax: Definition einer formalen Grammatik, um Regeln einer formalen Sprache (Programmiersprache) festzulegen.
Binäre Bäume Darstellung und Traversierung
Binäre Bäume Darstellung und Traversierung Name Frank Bollwig Matrikel-Nr. 2770085 E-Mail [email protected] Datum 15. November 2001 0. Vorbemerkungen... 3 1. Terminologie binärer Bäume... 4 2.
Datenstrukturen & Algorithmen
Datenstrukturen & Algorithmen Matthias Zwicker Universität Bern Frühling 2010 Übersicht Binäre Suchbäume Einführung und Begriffe Binäre Suchbäume 2 Binäre Suchbäume Datenstruktur für dynamische Mengen
Praktische Informatik 3: Einführung in die Funktionale Programmierung Vorlesung vom 10.11.2010: Rekursive Datentypen
Rev. 1152 1 [23] Praktische Informatik 3: Einführung in die Funktionale Programmierung Vorlesung vom 10.11.2010: Rekursive Datentypen Christoph Lüth & Dennis Walter Universität Bremen Wintersemester 2010/11
Algorithmen und Datenstrukturen
Algorithmen und Datenstrukturen Dipl. Inform. Andreas Wilkens [email protected] Überblick Grundlagen Definitionen Elementare Datenstrukturen Rekursionen Bäume 2 1 Datenstruktur Baum Definition eines Baumes
CGI Programmierung mit Ha. Markus Schwarz
CGI Programmierung mit Ha Markus Schwarz Überblick Was ist funktionale Programmierung Einführung in Haskell CGI-Programmierung mit Haskell Ein etwas größeres Beispiel Was ist funktionale Programm Ein Programm
Abstrakte Klassen und Induktive Datenbereiche
Abstrakte Klassen und Induktive Datenbereiche Abstrakte Klassen, Induktive Datenbereiche, Bäume, Binärbäume, Bäume mit Blättern, Listen, Konstruktoren, Prädikate, Selektoren, Mutatoren, Operationen. Abstrakte
Tutorium Algorithmen & Datenstrukturen
June 16, 2010 Binärer Baum Binärer Baum enthält keine Knoten (NIL) besteht aus drei disjunkten Knotenmengen: einem Wurzelknoten, einem binären Baum als linken Unterbaum und einem binären Baum als rechten
XML Verarbeitung mit einer in Haskell eingebetteten DSL. Manuel Ohlendorf (xi2079)
XML Verarbeitung mit einer in Haskell eingebetteten DSL Manuel Ohlendorf (xi2079) 2.0.200 Manuel Ohlendorf Übersicht 1 2 Einführung Datenstruktur Verarbeitung Vergleich mit anderen Verfahren Fazit 2 Übersicht
Tutorium - Haskell in der Schule. Ralf Dorn - Dennis Buchmann - Felix Last - Carl Ambroselli
Tutorium - Haskell in der Schule Wer sind wir? Otto-Nagel-Gymnasium in Berlin-Biesdorf Hochbegabtenförderung und MacBook-Schule Leistungskurse seit 2005 Einführung Was ist funktionale Programmierung? Einführung
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
Die Programmiersprache C Eine Einführung
Die Programmiersprache C Eine Einführung Christian Gentsch Fakutltät IV Technische Universität Berlin Projektlabor 2. Mai 2014 Inhaltsverzeichnis 1 Einführung Entstehungsgeschichte Verwendung 2 Objektorientiert
Funktionale Programmierung
Funktionale Programmierung Jörg Kreiker Uni Kassel und SMA Solar Technology AG Wintersemester 2011/2012 2 Teil II Typen mit Werten und Ausdruck, sogar listenweise 3 Haskell Programme Programm Module ein
Binäre Bäume. 1. Allgemeines. 2. Funktionsweise. 2.1 Eintragen
Binäre Bäume 1. Allgemeines Binäre Bäume werden grundsätzlich verwendet, um Zahlen der Größe nach, oder Wörter dem Alphabet nach zu sortieren. Dem einfacheren Verständnis zu Liebe werde ich mich hier besonders
5.14 Generics. Xiaoyi Jiang Informatik I Grundlagen der Programmierung
Motivation für Generics: Containertypen speichern eine Anzahl von Elementen anderer Typen Wie definiert man die Containerklasse ArrayList? In der Definition könnte man als Elementtyp Object angeben maximale
Java Einführung VARIABLEN und DATENTYPEN Kapitel 2
Java Einführung VARIABLEN und DATENTYPEN Kapitel 2 Inhalt dieser Einheit Variablen (Sinn und Aufgabe) Bezeichner Datentypen, Deklaration und Operationen Typenumwandlung (implizit/explizit) 2 Variablen
Objektorientierte Programmierung
Unterlagen zur Veranstaltung Einführung in die Objektorientierte Programmierung Mit Processing Alexis Engelke Sommer 2012 Alexis Engelke Inhalt Level 1: Geometrie Hintergrundfarben Punkte, Linien und deren
Was bisher geschah Funktionale Programmierung in Haskell: Algebraische Datentypen Pattern Matching Polymorphie Typklassen Rekursive Datentypen:
Was bisher geschah Funktionale Programmierung in Haskell: Algebraische Datentypen Pattern Matching Polymorphie Typklassen Rekursive Datentypen: Peano-Zahlen, Listen, Bäume Rekursive Funktionen strukturelle
Datentypdeklarationen in Haskell. Heutiges Thema... Zum Einstieg und Vergleich... (1) Grundlegende Typmuster
Datentypdeklarationen in Haskell Heutiges Thema... Datenstrukturen in Haskell... Algebraische Datentypen (data Tree =...) Typsynonyme (type Student =...) Spezialitäten (newtype State =...)...selbstdefinierte
II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:
Technische Informatik für Ingenieure (TIfI) WS 2005/2006, Vorlesung 9 II. Grundlagen der Programmierung Ekkart Kindler Funktionen und Prozeduren Datenstrukturen 9. Datenstrukturen Daten zusammenfassen
13. Binäre Suchbäume
1. Binäre Suchbäume Binäre Suchbäume realiesieren Wörterbücher. Sie unterstützen die Operationen 1. Einfügen (Insert) 2. Entfernen (Delete). Suchen (Search) 4. Maximum/Minimum-Suche 5. Vorgänger (Predecessor),
Wiederholung ADT Menge Ziel: Verwaltung (Finden, Einfügen, Entfernen) einer Menge von Elementen
Was bisher geschah abstrakter Datentyp : Signatur Σ und Axiome Φ z.b. ADT Menge zur Verwaltung (Finden, Einfügen, Entfernen) mehrerer Elemente desselben Typs Spezifikation einer Schnittstelle Konkreter
Geordnete Binärbäume
Geordnete Binärbäume Prof. Dr. Martin Wirsing in Zusammenarbeit mit Gilbert Beyer und Christian Kroiß http://www.pst.ifi.lmu.de/lehre/wise-09-10/infoeinf/ WS 09/10 Einführung in die Informatik: Programmierung
Algorithmen und Datenstrukturen Suchbaum
Algorithmen und Datenstrukturen Suchbaum Matthias Teschner Graphische Datenverarbeitung Institut für Informatik Universität Freiburg SS 12 Motivation Datenstruktur zur Repräsentation dynamischer Mengen
Heutiges Thema... Datenstrukturen in Haskell... Algebraische Datentypen (data Tree =...) Typsynonyme (type Student =...)
Heutiges Thema... Datenstrukturen in Haskell... Algebraische Datentypen (data Tree =...) Typsynonyme (type Student =...) Spezialitäten (newtype State =...) Funktionale Programmierung (WS 2007/2008) / 4.
Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015
Java Crashkurs Kim-Manuel Klein ([email protected]) May 4, 2015 Quellen und Editoren Internet Tutorial: z.b. http://www.java-tutorial.org Editoren Normaler Texteditor (Gedit, Scite oder ähnliche)
Suchen und Sortieren
(Folie 69, Seite 36 im Skript) 5 6 1 4 Als assoziatives Array geeignet Schlüssel aus geordneter Menge Linke Kinder kleiner, rechte Kinder größer als Elternknoten Externe und interne Knoten Externe Knoten
Übung 9. Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9
Informatik I 2 Übung 9 Quellcode Strukturieren Rekursive Datenstrukturen Uebung 9 Quellcode Strukturieren Wenn alle Funktionen in einer Datei zusammengefasst sind wird es schnell unübersichtlich Mehrere
Funktionale Programmierung ALP I. Funktionen höherer Ordnung. Teil 2 SS 2013. Prof. Dr. Margarita Esponda. Prof. Dr.
ALP I Funktionen höherer Ordnung Teil 2 SS 2013 Funktionen höherer Ordnung Nehmen wir an, wir möchten alle Zahlen innerhalb einer Liste miteinander addieren addall:: (Num a) => [a -> a addall [ = 0 addall
Haskell zur Constraint-Programmierung HaL8
Haskell zur Constraint-Programmierung HaL8 Alexander Bau 2. Mai 2013 Wir benutzen eine Teilmenge von Haskell zur Spezifikation von Constraint- Systemen über Haskell-Datentypen. Ein Constraint-Compiler
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
Kapiteltests zum Leitprogramm Binäre Suchbäume
Kapiteltests zum Leitprogramm Binäre Suchbäume Björn Steffen Timur Erdag überarbeitet von Christina Class Binäre Suchbäume Kapiteltests für das ETH-Leitprogramm Adressaten und Institutionen Das Leitprogramm
Bäume. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 10: Collections 4. Inhalt. Bäume. Einführung. Bäume.
Universität Osnabrück 1 Bäume 3 - Objektorientierte Programmierung in Java Vorlesung 10: Collections 4 Einführung Bäume sind verallgemeinerte Listenstrukturen Lineare Liste Jedes Element hat höchstens
Repetitorium Informatik (Java)
Repetitorium Informatik (Java) Tag 6 Lehrstuhl für Informatik 2 (Programmiersysteme) Übersicht 1 Klassen und Objekte Objektorientierung Begrifflichkeiten Deklaration von Klassen Instanzmethoden/-variablen
Letztes Mal. static int ggt(int a, int b) { if (a == b) return a; else if (a > b) return ggt(a-b,b); else if (a < b) return ggt(a,b-a);
Letztes Mal static int ggt(int a, int b) { if (a == b) return a; else if (a > b) } return ggt(a-b,b); else if (a < b) return ggt(a,b-a); Darf hier nicht stehen! Compiler sagt: Missing return statement
Tutoraufgabe 1 (2 3 4 Bäume):
Prof. aa Dr. E. Ábrahám Datenstrukturen und Algorithmen SS Übungsblatt (Abgabe.0.0) F. Corzilius, S. Schupp, T. Ströder Allgemeine Hinweise: Die Hausaufgaben sollen in Gruppen von je bis Studierenden aus
19. Funktional-reaktive Programmierung
19. Funktional-reaktive Programmierung Graphische Figuren type Dimension = Int data Figure = Rect Dimension Dimension Triangle Dimension Angle Dimension Polygon [Point] Circle Dimension Translate Point
Idee: Wenn wir beim Kopfknoten zwei Referenzen verfolgen können, sind die Teillisten kürzer. kopf Eine Datenstruktur mit Schlüsselwerten 1 bis 10
Binäre Bäume Bäume gehören zu den wichtigsten Datenstrukturen in der Informatik. Sie repräsentieren z.b. die Struktur eines arithmetischen Terms oder die Struktur eines Buchs. Bäume beschreiben Organisationshierarchien
3.4 Strukturierte Datentypen
3.4 Strukturierte Datentypen Strukturen: Die Daten sind häufig nicht ein einzelner atomarer Wert (Zahl, Boolean, Symbol), sondern eine höhere Einheit mit vielen Eigenschaften. Jeder Eintrag einer Datenbank
Folge 19 - Bäume. 19.1 Binärbäume - Allgemeines. Grundlagen: Ulrich Helmich: Informatik 2 mit BlueJ - Ein Kurs für die Stufe 12
Grundlagen: Folge 19 - Bäume 19.1 Binärbäume - Allgemeines Unter Bäumen versteht man in der Informatik Datenstrukturen, bei denen jedes Element mindestens zwei Nachfolger hat. Bereits in der Folge 17 haben
Programmieren in Haskell
Programmieren in Haskell Felder (Arrays) Programmieren in Haskell 1 Was wir heute machen Motivationsbeispiel Die Typklasse Ix Felder in Haskell Funktionstabellierung Binäre Suche Pascalsches Dreieck Ein
Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein ([email protected].
Java Crashkurs Kim-Manuel Klein ([email protected]) May 7, 2015 Quellen und Editoren Internet Tutorial: z.b. http://www.java-tutorial.org Editoren Normaler Texteditor (Gedit, Scite oder ähnliche)
Funktionale Programmierung mit Haskell
Funktionale Programmierung mit Haskell Prof. Dr. Hans J. Schneider Lehrstuhl für Programmiersprachen und Programmiermethodik Friedrich-Alexander-Universität Erlangen-Nürnberg Sommersemester 2011 I. Die
WS 2011/2012. Georg Sauthoff 1. October 18, 2011
in in WS 2011/2012 Georg 1 AG Praktische Informatik October 18, 2011 1 [email protected] Neue Übungsgruppen in neue Übungsgruppen neue Tutoren Sprechstunden in GZI-Arbeitsraum (V2-240)
Funktionale Programmierung mit Haskell. Jan Hermanns
Funktionale Programmierung mit Haskell Jan Hermanns 1 Programmiersprachen imperativ deklarativ konventionell OO logisch funktional Fortran Smalltalk Prolog Lisp C Eiffel ML Pascal Java Haskell 2 von Neumann
EndTermTest PROGALGO WS1516 A
EndTermTest PROGALGO WS1516 A 14.1.2016 Name:................. UID:.................. PC-Nr:................ Beachten Sie: Lesen Sie erst die Angaben aufmerksam, genau und vollständig. Die Verwendung von
ALP I. Funktionale Programmierung
ALP I Funktionale Programmierung Sortieren und Suchen (Teil 1) WS 2012/2013 Suchen 8 False unsortiert 21 4 16 7 19 11 12 7 1 5 27 3 8 False sortiert 2 4 6 7 9 11 12 18 21 24 27 36 Suchen in unsortierten
Algorithmen und Datenstrukturen SS09
Foliensatz 8 Michael Brinkmeier Technische Universität Ilmenau Institut für Theoretische Informatik Sommersemester 29 TU Ilmenau Seite / 54 Binärbäume TU Ilmenau Seite 2 / 54 Binäre Bäume Bäume und speziell
14. Rot-Schwarz-Bäume
Bislang: Wörterbuchoperationen bei binären Suchbäume effizient durchführbar, falls Höhe des Baums klein. Rot-Schwarz-Bäume spezielle Suchbäume. Rot-Schwarz-Baum mit n Knoten hat Höhe höchstens 2 log(n+1).
Institut für Programmierung und Reaktive Systeme 25. August 2014. Programmier-Labor. 04. + 05. Übungsblatt. int binarysearch(int[] a, int x),
Technische Universität Braunschweig Dr. Werner Struckmann Institut für Programmierung und Reaktive Systeme 25. August 2014 Programmier-Labor 04. + 05. Übungsblatt Aufgabe 21: a) Schreiben Sie eine Methode
Javaprogrammierung mit NetBeans. Variablen, Datentypen, Methoden
Javaprogrammierung mit NetBeans Variablen, Datentypen, Methoden Programmieren 2 Java Bezeichner Bezeichner: Buchstabe _ $ Buchstabe _ $ Ziffer Groß- und Kleinbuchstaben werden strikt unterschieden. Schlüsselwörter
Informatik 11 Kapitel 2 - Rekursive Datenstrukturen
Fachschaft Informatik Informatik 11 Kapitel 2 - Rekursive Datenstrukturen Michael Steinhuber König-Karlmann-Gymnasium Altötting 15. Januar 2016 Folie 1/77 Inhaltsverzeichnis I 1 Datenstruktur Schlange
Informatik II, SS 2014
Informatik II SS 2014 (Algorithmen & Datenstrukturen) Vorlesung 10 (3.6.2014) Binäre Suchbäume I Algorithmen und Komplexität Zusätzliche Dictionary Operationen Dictionary: Zusätzliche mögliche Operationen:
5.4 Klassen und Objekte
5.4 Klassen und Objekte Zusammenfassung: Projekt Figuren und Zeichner Figuren stellt Basisklassen für geometrische Figuren zur Verfügung Zeichner bietet eine übergeordnete Klasse Zeichner, welche die Dienstleistungen
Kapitel 6. Vererbung
1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben
Typdeklarationen. Es gibt in Haskell bereits primitive Typen:
Typdeklarationen Es gibt in bereits primitive Typen: Integer: ganze Zahlen, z.b. 1289736781236 Int: ganze Zahlen mit Computerarithmetik, z.b. 123 Double: Fließkommazahlen, z.b. 3.14159 String: Zeichenketten,
Kapitel 6. Vererbung
1 Kapitel 6 2 Ziele Das sprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen Subtyping Überschreiben
Einführung in die Java- Programmierung
Einführung in die Java- Programmierung Dr. Volker Riediger Tassilo Horn riediger [email protected] WiSe 2012/13 1 Wichtig... Mittags keine Pommes... Praktikum A 230 C 207 (Madeleine + Esma) F 112 F 113
Der linke Teilbaum von v enthält nur Schlüssel < key(v) und der rechte Teilbaum enthält nur Schlüssel > key(v)
Ein Baum T mit Knotengraden 2, dessen Knoten Schlüssel aus einer total geordneten Menge speichern, ist ein binärer Suchbaum (BST), wenn für jeden inneren Knoten v von T die Suchbaumeigenschaft gilt: Der
Java Einführung Operatoren Kapitel 2 und 3
Java Einführung Operatoren Kapitel 2 und 3 Inhalt dieser Einheit Operatoren (unär, binär, ternär) Rangfolge der Operatoren Zuweisungsoperatoren Vergleichsoperatoren Logische Operatoren 2 Operatoren Abhängig
Formale Methoden in der Informatik Wiederholung klassische Logik Konkrete Datentypen (algebraische Strukturen) Abstrakte Datentypen
Was bisher geschah Formale Methoden in der Informatik Wiederholung klassische Logik Konkrete Datentypen (algebraische Strukturen) Abstrakte Datentypen Syntax: Signatur Semantik: Axiome (FOL-Formeln, meist
3.3.6 Rekursive Datentypen
3.3.6 Rekursive Datentypen Die Rekursion von Datentypen bewirkt den Übergang zu abzählbar unendlichen Wertebereichen, deren Elemente nach einem festen Schema gleichartig aus einfacheren Elementen eines
Grundlagen der Programmierung 2 (1.C)
Grundlagen der Programmierung 2 (1.C) Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 3. Mai 2006 Funktionen auf Listen: map map :: (a -> b) -> [a] -> [b] map f [] = []
Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12. Kapitel 13. Bäume. Bäume
1 Kapitel 13 Ziele 2 Den Begriff des Baums in der Informatik kennenlernen als verkettete Datenstruktur repräsentieren können Rekursive Funktionen auf n verstehen und schreiben können Verschiedene Möglichkeiten
Mathematik II Frühlingsemester 2015 Kap. 9: Funktionen von mehreren Variablen 9.2 Partielle Differentiation
Mathematik II Frühlingsemester 2015 Kap. 9: Funktionen von mehreren Variablen 9.2 Partielle Differentiation www.math.ethz.ch/education/bachelor/lectures/fs2015/other/mathematik2 biol Prof. Dr. Erich Walter
5 Logische Programmierung
5 Logische Programmierung Logik wird als Programmiersprache benutzt Der logische Ansatz zu Programmierung ist (sowie der funktionale) deklarativ; Programme können mit Hilfe zweier abstrakten, maschinen-unabhängigen
DATENSTRUKTUREN UND ZAHLENSYSTEME
DATENSTRUKTUREN UND ZAHLENSYSTEME RALF HINZE Institute of Information and Computing Sciences Utrecht University Email: [email protected] Homepage: http://www.cs.uu.nl/~ralf/ March, 2001 (Die Folien finden
Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala
Das Typsystem von Scala 1 Eigenschaften Das Typsystem von Scala ist statisch, implizit und sicher 2 Nichts Primitives Alles ist ein Objekt, es gibt keine primitiven Datentypen scala> 42.hashCode() res0:
Kapitel 6. Vererbung
Kapitel 6 Vererbung Vererbung 1 Ziele Das Vererbungsprinzip der objektorientierten Programmierung verstehen Und in Java umsetzen können Insbesondere folgende Begriffe verstehen und anwenden können: Ober/Unterklassen
Tutoraufgabe 1 (Datenstrukturen in Haskell):
Prof. aa Dr. J. Giesl Programmierung WS12/13 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder Allgemeine Die Hausaufgaben sollen in Gruppen von je 2 Studierenden aus der gleichen Kleingruppenübung (Tutorium)
Generische Record-Kombinatoren mit statischer Typprüfung
System Generische mit statischer Typprüfung Brandenburgische Technische Universität Cottbus Lehrstuhl Programmiersprachen und Compilerbau Lehrstuhlkolloquium am 13. Januar 2010 Überblick System System
Programmiersprache C. Grundlegende Konstrukte 5/1
Programmiersprache C Grundlegende Konstrukte 5/1 Variablen Haskell Benannter Ausdruck eines Zwischenergebnisses Unveränderbar nach Vollzug der Bindung C Benannter Speicherplatz für Zwischenergebnisse Allokation
1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)
Praktische Informatik (Software) Vorlesung Softwareentwicklung 1 Prof. Dr. A. Ferscha Hauptklausur am 01. 02. 2001 Zuname Vorname Matr. Nr. Stud. Kennz. Sitzplatz HS / / / Punkte Note korr. Fügen Sie fehlende
ALP I Einführung in Haskell
ALP I Einführung in Haskell WS 2012/2013 Was ist Haskell? Haskell ist eine rein Funktionale Programmiersprache mit einer nach Bedarf Auswertung-Strategie oder "Lazy Evaluation". Was bedeutet rein funktional?
Aufgabenblatt Nr. 5 Generizität und TicTacToe
Aufgabenblatt Nr. 5 Generizität und TicTacToe 1 Generische Sortier-Methode 1.1 Aufgabe: Entwickeln einer generischen Sortiermethode für Objekte mit der Schnittstelle Comparable Ihnen ist aus der Vorlesung
Funktionale Programmierung. ALP I Lambda-Kalkül. Teil IVb WS 2012/2013. Prof. Dr. Margarita Esponda. Prof. Dr. Margarita Esponda
ALP I Lambda-Kalkül Teil IVb WS 2012/2013 λ-kalkül-parser Hilfsfunktionen: Die break-funktion ist eine Funktion höherer Ordnung, die eine Liste beim ersten Vorkommen einer Bedingung in zwei Listen spaltet.
Algorithmik II. a) Fügen Sie in einen anfangs leeren binären Baum die Schlüsselfolge 20, 28, 35, 31, 9, 4, 13, 17, 37, 25 ein.
Aufgabe 10 Binäre Bäume a) Fügen Sie in einen anfangs leeren binären Baum die Schlüsselfolge, 28, 35, 31, 9, 4,, 17, 37, 25 ein. 1. Einfügen von : 3. Einfugen von 35: 2. Einfügen von 28: 28 28 10. Einfügen
Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder
Programmieren in PASCAL Bäume 1 1. Baumstrukturen Eine Baumstruktur sei folgendermaßen definiert. Eine Baumstruktur mit Grundtyp Element ist entweder 1. die leere Struktur oder 2. ein Knoten vom Typ Element
[10] Software Transactional Memory in Haskell, Tortenwurf und Aufgabenblatt 7
Haskell Live [10 Software Transactional Memory in Haskell, Tortenwurf und Aufgabenblatt 7 Bong Min Kim [email protected] Christoph Spörk [email protected] Bernhard Urban [email protected]
Informatik II Bäume. Beispiele. G. Zachmann Clausthal University, Germany [email protected]. Stammbaum. Stammbaum. Stammbaum
lausthal Beispiele Stammbaum Informatik II. Zachmann lausthal University, ermany [email protected]. Zachmann Informatik - SS 06 Stammbaum Stammbaum / Parse tree, Rekursionsbaum Parse tree, Rekursionsbaum
