HASKELL KAPITEL 5. Rekursion
|
|
|
- Beate Pohl
- vor 7 Jahren
- Abrufe
Transkript
1 HASKELL KAPITEL 5 Rekursion
2 Die Fakultätsfunktion 0! = 1 n! = n* (n-1)! falls n > 0 fac :: Int Int fac n = if n = 0 then 1 else n*fac(n 1) 2
3 Der Binominalkoeffizient n 0 = n n = 1 n k = n-1 k-1 + n-1 k n>0, k>0 binom :: Int Int Int binom n k = if k = 0 k = n then 1 else binom(n-1, k-1) + binom(n-1, k) 3
4 Wurzel ziehen durch Approximation 19 liegt bestimmt im Intervall [0,...,19]. Algorithmus: halbieren (9.5), Hälfte quadrieren, zu gross. weiter mit der linken Hälfte... Abbruckriterium: ( ) :: float float bool x y = abs(x y ) <
5 Approximation approx :: float float float float approx x low high let middle == (low + high)/2 in square middle x = middle square middle > x = approx x low middle square middle < x = approx x middle high 5
6 verschiedene Sorten Rekursion 1. Repetitive Rekursion im Rumpf wird die Funktion in jedem Zweig höchstens ein mal, und ganz außen aufgerufen. Beispiel bisher: approx und die modulo a Funktion: mod :: Int Int Int mod a b = if b < a then b else moda (b a) 6
7 2. Lineare Rekursion im Rumpf wird die Funktion in jedem Zweig höchstens ein mal, aber nicht unbedingt ganz außen aufgerufen. Beispiel: fac (oben:...n*fac(n 1)...) und die inverse Quadratsumme: invsqsum :: Int Int invsqsum n n = 0 = 0 n > 0 = 1/(n*n) + invsqsum(n 1) 7
8 3. Baumartige Rekursion im Rumpf wird die Funktion mehrfach nebeneinander aufgerufen. Beispiel bisher. die binom Funktion und die Fibonacci-Funktion: fib :: Int Int fib n n = 0 = 0 n = 1 = 1 n > 2 = fib (n 1) + fib (n 2) 8
9 4. Geschachtelte Rekursion im Rumpf wird die Funktion mehrfach hintereinander aufgerufen. Beispiel: die 91-Funktion: f91 :: Int Int f91 n n > 100 = n 10 n < 100 = f91 ( f91(n + 11) )... liefert 91 für jedes Argument unter 102 9
10 4. Geschachtelte Rekursion noch ein Beispiel: schnelle ganzzahlige Division: div :: Int Int Int div a b a < b = a b < a a < 2*b = a b a > 2*b = div (div a 2*b ) b 10
11 4. Ausdruckskraft geschachtelte Rekursion ist nicht reduzierbar auf ungeschachtelte. Beispiel: Die Ackermann-Funktion ack :: Int Int Int ack m n m = 0 = n + 1 m > 0 n = 0 = ack (m 1) 1 m > 0 n > 0 = ack (m 1) (ack (m 1) (n 1)) 11
12 5. Verschränkte Rekursion im Rumpf rufen sich mehrere Funktionen gegenseitig auf (kommt oft bei Interpretern vor) Beispiel (etwas künstlich): even, odd :: nat d bool even n n = 0 = true n > 0 = odd (n 1) odd n n = 0 = false n > 0 = even (n 1) 12
13 Interpreter einer Programmiersprache (angedeutet) executestatement =... evalexpression... evalexpression =... processmethodcall... processmethodcall =... executestatement... Typ: verschränkte Rekursion: Mehrere Funktionen rufen sich gegenseitig
14 HASKELL KAPITEL 6 Funktionen höherer Ordnung
15 6.1 Funktionen als Argument 2
16 Beispiel: min und max verallg. extreme :: (Int Int Bool) Int Int Int Int extreme before a b c (a before b) (a before c) = a (b before a) (b before c) = b (c before a) (c before b) = c Dann gilt: min (a, b, c) max (a, b, c) = extreme < a b c = extreme > a b c 3
17 Beispiel: Differential gegeben: stetig differenzierbare Funktion f: R R x R gesucht: Steigung von f an der Stelle x mathematische Notation: dif :: (Float Float) (Float Float) dif f x =... übliche Schreibweise: f statt dif f typische Anwendungen: dif square 0.7 Resultat: 1.4 5
18 dif Differentialrechnung :: (Float Float) (Float Float) dif f x = let h 0 = 0.1 d 0 = diffquotient f x h 0 in iterate x h 0 d 0 fehlt noch: Funktionen diffquotient und iterate übliche Schreibweise: f statt dif f 6
19 Die Funktion iterate iterate :: Float Float Float Float iterate x h old d old = let h new = h / 2 old in d new = diffquotient f x h new if d old d new then d new else iterate x h new d new fehlt noch: Funktionen diffquotient und 7
20 Die Funktionen diffquotient und diffquotient :: (Float Float) Float Float Float diffquotient f x h = (f(x + h) f(x h)) / (2 * h) :: Float Float Float x y = ( abs (x y) < ) f :: Float Float f x =... die gewünschte Funktion 8
21 entsprechend: Integral gegeben: stetige Funktion f: R R a, b R gesucht: Fläche zwischen der x-achse und der Kurve von f zwischen a und b. mathematische Notation: integral :: (Float Float ) Float Float Float integral f a b typische Anwendungen: integral sin 0 π/2 integral cos π/4 3π/2 9
22 6.2 Funktionen als Argumente und Resultate 10
23 Funktion f um dx verschieben mit der bekannten Funktion sin: cos = shift( π/2) (sin) shift :: Float (Float Float) (Float Float) shift dx f x = f (x dx) in der Graphik: g == shift dx f 11
24 graphisch 12
25 Funktion f an der y-achse spiegeln mirror :: (Float Float) (Float Float) mirror f x = f ( x) in der Graphik: g == mirror f 13
26 Funktion f um den Faktor r strecken stretch :: Float (Float Float) (Float Float) stretch r f x = f (x /r) in der Graphik: g == stretch r f 14
27 6.3 einige allgemeine Funktionale 15
28 Verwendung symbolischer Typen Sei α ein beliebiger Typ, z.b. Int oder Float typische Verwendung: Identitätsfunktion: id :: α d α id x = x Konstante Fuktion: K :: (α β α ) K x y = x 16
29 Komposition g nach f : ( ): :: ((β γ), (α β)) (α γ) ( g f ) x = g f x g vor f : (;) :: ((α β), (β γ)) (α γ) f ; g = g f Haskell: ( f ; g ) x = g f x 17
30 n fache Iteration f n schreiben wir als f ^ n: (^) :: (α α) Int (α α) f ^ n x = n = 0 = x n > 0 = f ^ (n 1) f x genauso gut geschrieben: f ^ n x = n = 0 = x n > 0 = f ^ (n 1) f x 18
31 while klassisches Programm: while p(x) do f(x) funktional geschrieben: while :: ((α Bool), (α α)) (α d α) while (p, f ) x = if p x then while ( p, f ) f x else x 19
32 entsprechend: until klassisches Programm: do f(x) until p(x) funktional geschrieben: until :: ((α α), (α Bool)) (α d α) until ( f, p ) x = let y = f x in if p y then y else until (f, p) y es gilt: ( f until q ) == while ( p, f ) f 20
33 boole sche Operationen als Funktionen :: (α Bool) (α Bool) ( ) :: (α Bool) (α Bool) (α Bool) ( ) :: (α Bool) (α Bool) (α Bool) ( p) a = (p a) (p q) a = (p a) (q a) (p q) a = (p a) (q a) 21
34 6.4 Beispiele aus der Numerik 22
35 Summe häufig gegeben: Funktionen f, h : Float Float und ein Prädikat p : Float Bool. gesucht: Summe der Art f(x) + f(h(x)) + f(h 2 (x)) + f(h 3 (x)) f( h n (x)). wobei n die kleinste Zahl ist mit p(f(h n+1 (x))). sum :: (Float Float ) (Float Float ) (Float Bool) d (Float Float ) sum f h p x = if p x then f x + sum f h p h x else 0 23
36 Konvergenz häufig gegeben: Funktion h : Float Float, die für jedes x konvergiert d.h. lim n d h n x existiert. Aufgabe: Berechne lim n d h n x näherungsweise d.h. bis h(x) ~ x. converge :: (Float Float ) Float Float converge h x = if h x ~ x then h x else converge h h x 24
37 HASKELL KAPITEL 7 Datentypen
38 7.1 Boole sche Werte Schlüsselwort: einen Datentyp bilden Alternativen einer Aufzählung data Bool = False True. - a == False: not a == True not :: Bool Bool - a == True: not a == False not False = True - a == ein Wert ungleich not True = False True und False verwendbar als Reduktionsregel für not e : erst e reduzieren zu einem (Typfehler): not a == - die Berechnung von a nicht terminiert: not a == Ausdruck a (wenn möglich). - a == : not a == Dann gilt: Wenn... Résumé: drei bool. Werte!! 2
39 Boole sche Operationen ( ), ( ) :: Bool Bool Bool False x = False True x = x False x = x True x = True Motivation: Pattern Matching arbeitet von links nach rechts. Konsequenz: False = False False = False = False = True = True = True True = True = 3
40 Bemerkung zu Jeder Datentyp hat ein implizites undefined. ist im Rechner nicht notwendig darstellbar. Statt kann der Rechner auch Typfehler sagen oder gar nichts sagen (weiterrechnen bis Systemabbruch) Die Semantik von Haskell verlangt hier nichts spezielles. Eine Funktion f ist strikt, wenn f( ) ==. Beispiele: not ist strikt, ist nicht strikt. False = False 4
41 eine weitere Rolle von Bedeutung von == : Rechner testet Gleichheit Bedeutung von = : definierend (und im üblichen mathematischen Sinn, gut geschrieben als = def ) Konsequenz mathematisch: double == square ist falsch == ist wahr Haskell: beides kann das System nicht berechnen beim Berechnen von f u kommt immer was raus!... manchmal 5
42 7.1.1 Gleichheit und Ungleichheit (==) :: Bool Bool Bool x == y = (x y) (not x not y) ( ) :: Bool Bool Bool x y = not (x == y) 6
43 Überladung Manche Typen haben ein == und ein, manche haben es nicht. Streng genommen braucht jeder Typ sein eigenes == und sein (falls der Typ sie überhaupt enthält). Begründung: Sie werden jeweils anders realisiert. Idee: Typenklasse Eq bilden: Sie enthalte alle Typen, die ein == und ein haben. 7
44 Definition einer Typ-Klasse Schlüsselwörter class Eq α where (==), ( ) :: α α Bool α ist eine Variable für Typen Die Klasse Eq hat zwei Methoden, (==) und ( ). Beide haben den Typ α α Bool auch geschrieben: (==), ( ) :: Eq α e α α Bool 8
45 Instanz einer Typ-Klasse class Eq α where (==), ( ) :: α α Bool Ein Typ kann als Instanz der Klasse definiert werden. Beispiel: instance Eq Bool where x == y = (x y) (not x not y) x y = not (x == y) 9
46 Die Typ-Klasse ord Eine Menge kann man nur ordnen, wenn auf ihr Gleichheit definiert ist. Wenn < gegeben ist, wird daraus <, >, > abgeleitet: class (Eq α) e Ord α where (<), (<), (>), (>) :: α α Bool (x < y) = (x < y) (x == y) (x > y) = not (x < y) (x > y) = (x > y) (x == y) 10
47 Eine Instanz von ord zur Erinnerung: instance Eq Bool where x == y = (x y) (not x not y) x y = not (x == y) class (Eq α) e Ord α where (<), (<), (>), (>) :: α α Bool (x < y) = (x < y) (x == y) (x > y) = not (x < y) (x > y) = (x > y) (x == y) instance Ord Bool where False < False = False False < True = True True < False = False True < True = False damit gibt es auf Bool automatisch <, >, > 11
48 Die Datentypen Integer und Int Integer bezeichnet die ganzen Zahlen. Haskell garantiert genaues Rechnen (... und riskiert dabei Speicherüberlauf). Int bezeichnet eine Teilmenge von Integer, die gewöhnlich reicht. Haskell garantiert genug Speicher (... und riskiert an den Grenzen ungenaues Rechnen). 12
49 7.1.2 Beispiel: Schaltjahr leapyear :: Int Bool leapyear y = (y mod 4 == 0) (y mod y mod 400 == 0) alternativ: leapyear y = if (y mod 100 == 0) then (y mod 400 == 0) else (y mod 4 == 0) 13
50 7.1.3 Beispiel: Dreiecke Gegeben: 3 ganze Zahlen, a < b < c. Bekannt: Wenn a+b > c, gibt es ein Dreieck D, dessen Seiten die Länge a, b, und c haben. D ist gleichschenklig, wenn 2 Seiten gleich lang sind. D ist gleichseitig, wenn alle 3 Seiten gleich lang sind. D ist unregelmäßig, wenn D nicht gleichschenklig ist. Aufgabe: ein Haskell-Programm mit einem Zahlentripel als Parameter, das auf diese Eigenschaften hin analysiert wird. 14
51 Dreiecke in Haskell data Triangle = Fehlerhaft Gleichschenklig Gleichseiteig Unregelmäßig analyse :: (Int, Int, Int) Triangle analyze (x, y, z) x +y < z = Fehlerhaft x == z = Gleichseitig x == y y == z = Gleichschenklig otherwise = Unregelmäßig Bem.: klappt nur unter der Annahme x < y < z. 15
52 7.2 Der Datentyp Char Char hat 256 Elemente: data Char = Char0 Char1... Char255 mit einer Konvention zur Bezeichnung der Elemente. Beispiel: b für Char98. Die meisten sind sichtbar, der Rest sind control-zeichen. Ein Element von Char wird in... notiert. Beispiele: a 7 newline: Leerzeichen t 16
53 Bezug zwischen Char und Int ord :: Char Int chr :: Int Char ( chr n definiert für 0 < n < 256 ) für jedes x vom Typ Char gilt: chr (ord x) = x Beispiele: ord b ergibt 98 chr 98 ergibt b chr (ord b +1) ergibt c ord ergibt 10 17
54 Char als Aufzählungstyp Gleichheit auf Char: instance Eq Char where (x == y) = (ord x == ord y) in Int Ordnung auf Char: instance Ord Char where (x < y) = (ord x < ord y) Konsequenzen: 0 < 9 a < z A < Z A < a 18
55 Umgang mit Char isdigit, islower, isupper :: Char Bool isdigit c = ( 0 < c) (c < 9 ) islower c = ( a < c) (c < z ) isupper c = ( A < c) (c < Z ) capitalize :: Char Char capitalize c = if islower c then chr (offset + ord c) else c 19 where offset = ord A ord a
56 wie man was beweisen kann capitalize a = { def. capitalize und islower a = True } chr (offset + ord a ) = { def. von offset } chr ((ord A ord a ) + ord a ) = { Arithmetik } chr (ord A ) = {chr (ord x) = x} A capitalize :: Char Char capitalize c = if islower c then chr (offset + ord c) else c 20 where offset = ord A ord a
57 7.3 Aufzählungstypen Konstante: Zeichenkette, beginnt mit Großbuchstabe damit bisher: data Bool = False True. data Triangle = Fehlerhaft Gleichschenklig Gleichseiteig Unregelmäßig data Char = Char0 Char1... Char255 21
58 allg. Form für Aufzählungstypen typisches Beispiel: data Day = Sun Mon Thu Wed Thu Fri Name des Aufzählungstyps Schlüsselworte Konstante, in der Rolle von Konstruktoren des Aufzählungstyps implizit immer mit dabei: Konstruktor Day hat also 8 Elemente. Bool hat 3 Elemente 22
59 class Enum α where fromenum :: α Int toenum :: Int α Enumerationstypen gewünscht, aber in Haskell nicht ausdrückbar: toenum (fromenum x)) = x 23
60 Day als Enumerationstyp class Enum α where fromenum :: α Int toenum :: Int α fromenum für α = Day : instance Enum Day where fromenum Sun = 0 fromenum Mon= 1 fromenum Tue = 2 fromenum Wed = 3 fromenum Thu = 4 fromenum Fri = 5 fromenum Sat = 6 toenum: später 24
61 Day als geordneter Typ instance Eq Day where (x == y) = (fromenum x == fromenum y) instance Ord Day where (x < y) = (fromenum x < fromenum y) Anwendungen: workday :: Day Bool workday d = ( Mon < d) (d < Fri) restday restday d :: Day Bool = ( d == Sat) (d == Sun) 25
62 morgen dayafter :: Day Day dayafter d = toenum ((fromenum d + 1) mod 7) insbesondere: dayafter Sun = Mon 26
63 Char als Enumerationstyp instance Enum Char where fromenum = ord toenum = chr 27
64 7.3.1 Automatische Instanz-Daklaration bisher: 3 Typklassen Eq, Ord, Enum und Instanzen davon für Bool, Char, Day Kurzschreibweise mit deriving: data Day = Sun Mon Thu Wed Thu Fri Sat deriving (Eq, Ord, Enum) 28
65 7.4 Tupel Tupel: aus 2 Typen die Paare bilden übliche Schreibweise der Mathematik: A B kartesisches Produkt der Mengen A und B Haskell: (A, B) Beispiel: (Integer, Char) 29
66 Tupel als polymorpher Typ Mit Variablen α, β für Typen: (α, β ) ist Kurzform der Typdeklaration data Pair α, β = MkPair α, β Der Konstruktor MkPair ist eine Funktion! bisher: Konstruktoren waren Konstante: data Bool = False True. data Char = Char0 Char1... Char255 Typ von MkPair : MkPair :: α β Pair α β als kartesisches Produkt nicht sinnvoll darstellbar: MkPair: α β α β 30 MkPair(x, y) = (x, y)????
67 Funktionen für Pair data Pair α, β = MkPair α, β MkPair x y wird kurz geschrieben als (x,y) zwei kanonische Funktionen: fst :: (α,β ) α fst (x,y) = x snd :: (α,β ) β snd (x,y) = y Berechnen: Pattern matching: 31 fst e formt e in die Form (x, y) um und gibt dann x aus.
68 für (α, β) undefined :: (α, β) undefined = undefined liefert, weil nicht reduzierbar ist verschieden von (, ), wenn das undefined von α oder von β ist. Beweis: test :: (α, β) bool test (x, x) = True mit pattern matching folgt: test =, wg. Typfehler, test (, ) = True 32
69 mehrere Funktionen als Argumente pair :: (α β, α γ ) α (β, γ ) pair (f, g ) x = (f x, g x ) cross :: (α β, γ δ ) (α, γ ) (β, δ ) cross (f, g ) = pair (f fst, g snd ) 33
70 Eigenschaften von pair und cross fst pair ( f,g) = f snd pair ( f,g) = g pair ( f,g) h = pair ( f h, g h) cross ( f, g) pair (h, k) = pair ( f h, g k) Beweise gehen punktfrei (hier keine Einzelheiten)... damit im Haskell-System 34
71 Beispiel für Tupel die beiden reellen Wurzeln einer quadratischen Gleichung ax 2 + bx + c = 0 roots :: (Float, Float, Float) (Float, Float) roots (a, b, c) a == 0 = error not quadratic e < 0 = error complex roots otherwise = (( b r)/d, ( b+r) /d ) where r = sqrt e d = 2*a e = b*b 4*a*c 35
72 Operationen auf Tupel vererben Gleichheit: Wenn α und β Gleichheit haben, dann hat (α, β ) eine kanonische Gleichheit: instance (Eq α, Eq β ) e Eq (α,β ) where (x, y) == (u, v) = (x == u) (y == v) Ordnung: Wenn α und β total geordnet sind, dann hat (α, β ) eine kanonische lexikographische totale Ordnung: instance (Ord α, Ord β ) e Ord (α,β ) where (x, y) < (u, v) = (x < u) (x == u y < v) 36
73 Konsequenz für < auf Grund der Ordnung des pattern Matchig: (1, ) < (2, ) ergibt True (, 1) < (, 2) ergibt Ordnung: Wenn α und β total geordnet sind, dann hat (α, β ) eine kanonische lexikographische totale Ordnung: instance (Ord α, Ord β ) e Ord (α,β ) where (x, y) < (u, v) = (x < u) (x == u y < v) 37
74 Nullstellige Funktionen Typ ( ) Nullstelliges hat 2 Elemente: und () leeres Argument damit kann man 0-stellige Funktionen f: {()} A bilden. Beispiel: pifun :: ( ) Float pifun () = Jedes Element ist eine 0-stellige Funktion A 0 A A 38
75 wo sinnvoll verwendbar? im punktfreien Programmieren nur noch: Funktionen komponieren nicht mehr: Funktion auf Argument anwenden Beispiel: square square pifun statt (square square) pi Die Welt (der Funktionalen Programmierung) besteht aus Funktionen 39
76 7.5 Typen vereinigen Bool 4 Char kann man in Haskell nicht schreiben. Man braucht Konstruktoren, die aus dem zusammengesetzten Typ die Komponenen heraussortieren: data Either = Left Bool Right Char Ausdruck Left True ist korrekt, nicht weiter reduzierbar 40
77 allgemeiner data Either αβ = Left α Right β Die Konstruktoren Left und Right ergeben sich kanonisch: Left: :: α Either αβ Right: :: β Either αβ Der obige Typ heißt dann data Either Bool Char 41
78 Verwendung data Either α β = Left α Right β. Left :: α Either a β Right :: β Either a β case :: (α γ, β γ) Either αβ γ case (f, g) (Left x) = f x case (f, g) (Right y) = g y damit definierbar: plus :: (α β, γ δ) Either αβ Either γδ plus (f, g) case( Left f, Right g) 42
79 Eigenschaften von Either und case data Either α β = Left α Right β. case :: (α γ, β γ ) Either αβ γ case ( f, g) Left = f case ( f, g) Right = g h case ( f, g) = Either ( f h, g k) case ( f, g) plus (h, k) = Either ( f h, g k) 43
80 kanonische Übertragung von == und < instance (Eq α, Eq β ) e Eq (α,β ) where Left x == Left y = ( x == y ) Left x == Right y = False Right x == Left y = False Right x == Right y = ( x == y ) instance (Ord α, Ord β ) e Ord (α,β ) where Left x < Left y = ( x < y ) Left x < Right y = True Right x < Left y = False Right x < Right y = ( x < y ) 44
81 kürzer data Either αβ = Left α Right β deriving ( Eq, Ord )... damit: die wichtigsten Konstruktionen für neue Datentypen. es fehlt: Rekursion... kommt später 45
82 7.6 Typ-Synomie alternativer Name für bekannten Typ früheres Beispiel: die beiden Wurzeln einer quadratischen Gleichung. Deklaration: roots :: (Float, Float, Float) (Float, Float) intuitiver: type Coeffs = (Float, Float, Float) type Roots = (Float, Float) roots :: Coeffs Roots 46
83 noch ein Beispiel von einer Position (x, y) aus in einem Winkel a eine Strecke d zurücklegen; Endpunkt ausrechnen. type Position = (Float, Float) type Angle = Float type Distance = Float move :: Distance Angle Position Position move d a (x, y) = (x + d * cos a, y + d * sin a) 47
84 Typ-Synomien mit Typ-Variablen sinnvolle Synonym-Deklarationen: type Pairs α = (α, α ) type Automorphism = α α type Flag α = (α, Bool ) rechte Seite muss bekannt sein. Ist der Fall bei type Bools = Pairs Bool synonym für (Bool, Bool ) Synonyme in Deklarationen verwenden: data onetwo α = one α Two (Pairs α) 48
85 7.6.1 neue Typen Ein Typ-Synonym erbt alle Klasseninstanzen des definierenden Typs. Das ist gelegentlich nicht erwünscht. Beispiel: type Angle = Float erbt == von Float. Gewünscht: Gleichheit modulo 2*π. Dafür nötig: neuen Datentyp data Angle = MkAngle Float mit dem Konstruktor MkAngle. 49
86 Beispiel: data Angle data Angle = MkAngle Float instance Eq Angle where MkAngle x == MkAngle y = normalize x == normalize y normalize :: Float Float normalize x x < 0 = normalize (x + rot) x > rot = normalize (x rot) otherwise = x where rot = 2*π. 50
87 Problem damit data Angle ist ganz neu im Vergleich mit Float. data Angle hat eigenes. hin und herrechnen Angle Float braucht immer MkAngle Haskell: newtype Angle = MkAngle Float steigert Effizienz. 51
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........................................
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........................................
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
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
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
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
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
Einführung in Haskell
Einführung in Haskell Axel Stronzik 21. April 2008 1 / 43 Inhaltsverzeichnis 1 Allgemeines 2 / 43 Inhaltsverzeichnis 1 Allgemeines 2 Funktions- und Typdefinitionen 2 / 43 Inhaltsverzeichnis 1 Allgemeines
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
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
Typklassen. Natascha Widder
Typklassen Natascha Widder 19.11.2007 Motivation Typklassen fassen Typen mit ähnlichen Operatoren zusammen ermöglichen überladenen Funktionen Definition Typklassen Deklarationsschema class Name Platzhalter
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,
Crashkurs Haskell Mentoring WiSe 2016/17. Anja Wolffgramm Freie Universität Berlin
Crashkurs Haskell Mentoring WiSe 2016/17 Anja Wolffgramm Freie Universität Berlin 02/11/2016 , Inhalt Kommandozeile Haskell installieren & starten Ein 1. Haskell-Programm Funktionsdefinition Primitive
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
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
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
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
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
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
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
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
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
Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zur Übungsklausur -
Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zur Übungsklausur - Punkte: A1: 30, A2: 20, A3: 20, A4: 20, A5: 10, A6: 20 Punkte: /120 12.02.2012 Hinweis: Geben Sie bei allen
Kapitel 3: Eine einfache Programmiersprache. Programmieren in Haskell 1
Kapitel 3: Eine einfache Programmiersprache Programmieren in Haskell 1 Datentypen, Datentypdefinitionen data Instrument = Oboe HonkyTonkPiano Cello VoiceAahs data Musik = Note Ton Dauer Pause Dauer Musik
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
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?
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)
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
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
Kapitel 16 : Differentialrechnung
Kapitel 16 : Differentialrechnung 16.1 Die Ableitung einer Funktion 16.2 Ableitungsregeln 16.3 Mittelwertsätze und Extrema 16.4 Approximation durch Taylor-Polynome 16.5 Zur iterativen Lösung von Gleichungen
Crashkurs: Haskell. Mentoring FU Berlin Felix Droop
Crashkurs: Haskell Mentoring FU Berlin 7.11.2018 Felix Droop Crashkurs Haskell 1. GHCi Umgebung
Praktische Informatik 3: Funktionale Programmierung Vorlesung 2 vom : Funktionen und Datentypen
Rev. 1843 1 [35] Praktische Informatik 3: Funktionale Programmierung Vorlesung 2 vom 23.10.2012: Funktionen und Datentypen Christoph Lüth Universität Bremen Wintersemester 2012/13 2 [35] Fahrplan Teil
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
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
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)]
Musterlösung zur 2. Aufgabe der 4. Übung
Musterlösung zur 2. Aufgabe der 4. Übung Da viele von Euch anscheinend noch Probleme mit dem Entfalten haben, gibt es für diese Aufgabe eine Beispiellösung von uns. Als erstes wollen wir uns noch einmal
Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 3 -
Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 3 - Dozent: Prof. Dr. G. Rote Tutoren: J. Fleischer, T. Haimberger, N. Lehmann, C. Pockrandt, A. Steen 01.11.2011 Ziele
Lösungsmenge L I = {x R 3x + 5 = 9} = L II = {x R 3x = 4} = L III = { }
Zur Einleitung: Lineare Gleichungssysteme Wir untersuchen zunächst mit Methoden, die Sie vermutlich aus der Schule kennen, explizit einige kleine lineare Gleichungssysteme. Das Gleichungssystem I wird
Programmierkurs II. Typsynonyme & algebraische Datentypen
Programmierkurs II Typsynonyme & algebraische Datentypen Um Dinge der realen Welt abzubilden, ist es nur in den seltensten Fällen komfortabel alles als Zahlen, Strings oder Listen zu kodieren. Wir benötigen
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
Differential- und Integralrechnung
Brückenkurs Mathematik TU Dresden 2016 Differential- und Integralrechnung Schwerpunkte: Differentiation Integration Eigenschaften und Anwendungen Prof. Dr. F. Schuricht TU Dresden, Fachbereich Mathematik
Wirtschaftsmathematik Formelsammlung
Wirtschaftsmathematik Formelsammlung Binomische Formeln Stand März 2019 (a + b) 2 = a 2 + 2ab + b 2 (a b) 2 = a 2 2ab + b 2 (a + b) (a b) = a 2 b 2 Fakultät (Faktorielle) n! = 1 2 3 4 (n 1) n Intervalle
EINI WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure. Vorlesung 2 SWS WS 11/12
EINI WiMa 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 [email protected] http://ls1-www.cs.uni-dortmund.de
Einführung in die Funktionale Programmierung mit Haskell
Wiederholung Listen II Funktionsdefinition Einführung in die Funktionale Programmierung mit Haskell List-Comprehension, Patterns, Guards LFE Theoretische Informatik, Institut für Informatik, Ludwig-Maximilians
Informatik A WS 2007/08. Nachklausur
Informatik A WS 2007/08 Nachklausur 18.04.2008 Name:.............................. Matrikelnummer:.................. Tutor:.................. Bitte Zutreffendes ankreuzen: Hauptfach Bioinformatik Hauptfach
Geheimnisprinzip: (information hiding principle, Parnas 1972)
2. Abstrakte Datentypen 2.0 Begriffe Geheimnisprinzip: (information hiding principle, Parnas 1972) Zugriffe auf Teile einer Programmeinheit, die für die reguläre Benutzung nicht erforderlich sind, sollten
Teil II. Datentypen. T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2017/
Teil II Datentypen T. Neckel Einführung in die wissenschaftliche Programmierung IN8008 Wintersemester 2017/2018 25 Konzept von Teil II: Datentypen Hinweis: Die Erklärung des Konzepts im Sinne des Constructive
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
Programmieren 1 C Überblick
Programmieren C Überblick. Einleitung 2. Graphische Darstellung von Algorithmen 3. Syntax und Semantik 4. Einstieg in C: Einfache Sprachkonstrukte und allgemeiner Programmaufbau 5. Skalare Standarddatentypen
Kapitel 2. Mathematische Grundlagen. Skript zur Vorlesung Einführung in die Programmierung
LUDWIG- MAXIMILIANS- UNIVERSITY MUNICH DEPARTMENT INSTITUTE FOR INFORMATICS DATABASE Kapitel 2 Mathematische Grundlagen Skript zur Vorlesung Einführung in die Programmierung im Wintersemester 2012/13 Ludwig-Maximilians-Universität
Angewandte Mathematik und Programmierung
Angewandte Mathematik und Programmierung Einführung in das Konzept der objektorientierten Anwendungen zu mathematischen Rechnens WS 2013/14 Operatoren Operatoren führen Aktionen mit Operanden aus. Der
Bemerkung: der goldene Schnitt ϕ ist die positive Lösung der Gleichung: x 2 = 1 + x
Rekursive Definition der Fibonacci-Zahlen Erste Werte f 0 = 0, f 1 = 1, f n = f n 1 + f n 2 (n 2) n 0 1 2 3 4 5 6 7 8 9 10... 25... f n 0 1 1 2 3 5 8 13 21 34 55... 75025... Exakte Formel (de Moivre, 1718)
Übung zu Algorithmen und Datenstrukturen (für ET/IT)
Übung zu Algorithmen und Datenstrukturen (für ET/IT) Sommersemester 2015 Matthias Wieczorek Computer-Aided Medical Procedures Technische Universität München Administratives Zentralübung (Mittwoch, 09:45
Abschnitt 3: Mathematische Grundlagen
Abschnitt 3: Mathematische Grundlagen 3. Mathematische Grundlagen 3.1 3.2 Induktion und Rekursion 3.3 Boolsche Algebra Peer Kröger (LMU München) Einführung in die Programmierung WS 14/15 48 / 155 Überblick
2.3 Spezifikation von Abstrakten Datentypen
Abstrakte Datentypen (ADT) 2.3 Spezifikation von Abstrakten Datentypen Sichtbare Schnittstelle: Typbezeichner Signaturen der Operationen Spezifikation der Operationen Abstraktionsbarriere Implementierung
Übung zu Algorithmen und Datenstrukturen (für ET/IT)
Übung zu Algorithmen und Datenstrukturen (für ET/IT) Sommersemester 2017 Rüdiger Göbl, Mai Bui Computer Aided Medical Procedures Technische Universität München Administratives Zentralübung (Mittwoch, 09:45
Inhalt Kapitel 2: Rekursion
Inhalt Kapitel 2: Rekursion 1 Beispiele und Definition 2 Partialität und Terminierung 3 Formen der Rekursion Endständige Rekursion 4 Einbettung 29 Beispiele und Definition Rekursion 30 Man kann eine Funktion
Kapitel 1 Mengen. Kapitel 1 Mengen. Mathematischer Vorkurs TU Dortmund Seite 1 / 25
Kapitel 1 Mengen Kapitel 1 Mengen Mathematischer Vorkurs TU Dortmund Seite 1 / 25 Kapitel 1 Mengen Definition 1.1 (Menge) Unter einer Menge verstehen wir eine Zusammenfassung von Objekten zu einem Ganzen.
Theoretische Informatik II
Theoretische Informatik II Dr. Eva Richter / Holger Arnold Universität Potsdam, Theoretische Informatik, Sommersemester 2008 Übungsblatt 3 (Version 4) Abgabetermin: 13.5.2008, 12.00 Uhr Der λ-kalkül Da
1 Stückweise konstante Funktionen (ca =10 Punkte)
Einführung in die wissenschaftliche Programmierung Klausur Seite 1/5 Name, Vorname, Unterschrift: Matrikelnummer: 1 Stückweise konstante Funktionen (ca. 4+2+4=10 Punkte) In dieser Aufgabe soll eine Klasse
Mathematik II für Studierende der Informatik (Analysis und lineare Algebra) im Sommersemester 2018
(Analysis und lineare Algebra) im Sommersemester 2018 2. Juli 2018 1/1 Wir geben einige wesentliche Sätze über bestimmte Integrale an, deren Beweise man in den Standardlehrbüchern der Analysis findet.
7. Einführung in C++ Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt
7. Einführung in C++ Programmieren / Algorithmen und Datenstrukturen 1 Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt 1 Kontrollfragen Rekursion Was bedeutet Rekursion? Geben Sie Beispiele
Informatik 1. Prüfung im Wintersemester 1997/98
Informatik 1 Prüfung im Wintersemester 1997/98 Fachhochschule für Technik und Wirtschaft Reutlingen, Fachbereich Elektronik Prüfungsfach/Studiengang/Semester: Informatik 1 in Elektronik 1 Prüfer: Prof.
EINI LW/WiMa. Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 14/15
EINI LW/ Einführung in die Informatik für Naturwissenschaftler und Ingenieure Vorlesung 2 SWS WS 14/15 Dr. Lars Hildebrand Fakultät für Informatik Technische Universität Dortmund [email protected]
C++ Teil 5. Sven Groß. 16. Nov Sven Groß (IGPM, RWTH Aachen) C++ Teil Nov / 16
C++ Teil 5 Sven Groß 16. Nov 2015 Sven Groß (IGPM, RWTH Aachen) C++ Teil 5 16. Nov 2015 1 / 16 Themen der letzten Vorlesung Namensräume Live Programming zu A2 Gleitkommazahlen Rundungsfehler Auswirkung
Programmieren für Fortgeschrittene
Technische Universität Braunschweig Dr. Werner Struckmann Institut für Programmierung und Reaktive Systeme Wintersemester 2011/12 Programmieren für Fortgeschrittene Rekursive Spezifikationen Die folgende
