Kapitel 2: Grundlegende Elemente der Sprache Haskell
|
|
|
- Jasmin Bretz
- vor 9 Jahren
- Abrufe
Transkript
1 Funktionale Programmierung (WS2005/2006) 2/1 Kapitel 2: Grundlegende Elemente der Sprache Haskell Lernziele dieses Kapitels 1. Haskell-Syntax 2. Verstehen der häufigsten Fehlermeldungen 3. Fallunterscheidungen 4. Lokale Definitionen 5. Funktionen als Argument und Ergebnis 6. Tupel, Listen und List-Comprehensions 7. Polymorphie, Overloading 8. Algebraische Datentypen 9. Typklassen und Instanzen
2 Funktionale Programmierung (WS2005/2006) 2/2 Variablen, Wertmengen, Typen Paradigma imperativ funktional Variable steht für wiederverwendbaren Speicherplatz eindeutigen Wert, vor der Definition: Vordefinierte Typen in Haskell: Typ Wertemenge () unit {, ()} Bool Int Integer {, False, True} { } [(minbound::int)..(maxbound::int)] { } Z Außerdem: Zeichen(ketten): Char/String, Fließpunktzahlen: [Float Double], rationale Zahlen: Rational, komplexe Zahlen: Complex [Float Double]
3 Funktionale Programmierung (WS2005/2006) 2/3 Haskell-Ausdrücke und Typangaben testen mit dem Interpreter ghci Arithmetische Ausdrücke wie üblich: 2+3, 7*(5-2),... Typangaben nachgestellt mit ::Typname (2^12)^ (default: Integer) ((2^12)^5)::Int 0 (Überlauf nicht spezifiziert, hier mglw. modulo 232 ) Arithmetische Operatoren erzwingen Typgleichheit, Konstanten und Operatoren sind überladen (z.b. 2 { Int, Float,... }) (2::Int)+3 3 und das Ergebnis sind vom Typ Int ((2::Int)+3)::Integer Typfehler, keine implizite Typwandlung (coercion) in Haskell! (fromintegral ((2::Int)+3))::Integer OK, explizite Typwandlung (conversion) durch fromintegral
4 Funktionale Programmierung (WS2005/2006) 2/4 Der Interpreter ghci Auswertung (gib den Wert von 3+5 aus ) Prelude> Definition (sei x gleich 10001; Wert von x (3x 5 + x 2 )?) Prelude> let x=10001 Prelude> x*(3*x-5+x*x) Typabfrage (was ist der Typ des Ausdrucks (+)?) Prelude> :t (+) forall a. (Num a) => a -> a -> a Antwort: für alle Typen a gilt: a muss ein Zahlentyp (Num) sein und Argumente/Ergebnis von (+) haben denselben Typ a
5 Funktionale Programmierung (WS2005/2006) 2/5 Gültigkeitsbereiche von Variablen im ghci Prelude> let x=5 der Wert von x sei 5 Prelude> let y=x+1 der Wert von y sei x+1, also 6 Prelude> y==x+1 ist y gleich x+1? True Antwort: True, Typ: Bool Prelude> let x=0 neue Variable, die auch x heisst Prelude> y==x+1 ist y gleich x+1? False Antwort: False, Typ: Bool Prelude> y was ist der Wert von y? 6 Antwort: 6 Neudefinition (let x =) bewirkt Verschattung des alten Namens Referenzielle Transparenz gilt (Gültigkeitsbereich von x beachten!) Statische Variablenbindung (y an den Wert 6, nicht an x+1)
6 Funktionale Programmierung (WS2005/2006) 2/6 Syntax der Funktionsanwendung (Applikation) Prelude> let f x = x^2-3*x+1 definiere Funktion f Prelude> f 2 wende f auf den Zahlwert 2 an durch -1 Juxtaposition (=Hintereinanderschreibung) Prelude> f2 Fehler: f2 wird als Name angesehen Prelude> f(2) möglich, aber Klammern zur Tokentrennung unerwünscht -1 Prelude> f (f 2) wende f auf das Ergebnis von f 2 an 5 Prelude> f f 2 Typfehler, die Juxtaposition ist linksassoziativ und f soll als erstes Argument nicht f haben! Prelude> (f. f) 2 Funktionskomposition: f. f für f f Prelude> f $ f 2 Rechtsassoziativer Applikationsoperator $ hat 5 geringere Priorität als die Juxtaposition Achtung: $/. ohne Abstand haben andere Bedeutung ( $f Splice, A. Namespace)!
7 Funktionale Programmierung (WS2005/2006) 2/7 Haskell Moduldatei Datei Mean.hs module Mean where -- Kopfzeile mit Modulnamen Mean -- Typdefinitionen sum3, mean3 :: Double -> Double -> Double -> Double {- Arg.1 Arg.2 Arg.3 Ergebnis Funktionsdefinitionen (ohne let) -} sum3 x y z = x+y+z mean3 x y z = sum3 x y z / 3 Verwendung mit ghci Prelude> :l Mean Laden der Definitionen Compiling Mean ( Mean.hs, interpreted ) Ok, modules loaded: Mean. Mean> mean Anwendung von mean
8 Funktionale Programmierung (WS2005/2006) 2/8 Fehlermeldungen (1) Prelude> let x = 9 Prelude> x -7 2 Prelude> id -7 Fehler <interactive>:1: No instance for (Num (a -> a)) arising from use of - at <interactive>:1 In the definition of it : it = id - 7 Parser macht keine Typanalyse: - wird als Infix-Operator registriert, aber id ist eine Funktion, keine Zahl. stattdessen: Prelude> id (-7) -7
9 Funktionale Programmierung (WS2005/2006) 2/9 Fehlermeldungen (2) Prelude> let { f::integer->integer; f x = x+1 } Prelude> f 5 6 Prelude> f 4.0 Fehler <interactive>:1: No instance for (Fractional Integer) arising from the literal 4.0 at <interactive>:1 In the first argument of f, namely 4.0 In the definition of it : it = f 4.0 f erwartet ein Argument vom Typ Integer 4.0 gehört zur Typklasse Fractional (Zahlentypen mit Division ohne Rest) Integer / Fractional (No instance for (Fractional Integer))
10 Funktionale Programmierung (WS2005/2006) 2/10 Fehlermeldungen (3) Prelude> let { f :: Integer -> Integer; f x y = x+y } Fehler <interactive>:1: Couldn t match Integer against t -> t1 Expected type: Integer Inferred type: t -> t1 In the definition of f : f x y = x + y Nach Typdefinition ist f x vom Typ Integer Nach Funktionsgleichung ist f x vom Typ t -> t1, d.h. eine Funktion (erwartet y als weiteres Argument)
11 Funktionale Programmierung (WS2005/2006) 2/11 Fehlermeldungen (4) Prelude> let { f :: a->a; f x = x^2 } <interactive>:1: Could not deduce (Num a) from the context () arising from use of ^ at <interactive>:1 Probable fix: Add (Num a) to the type signature(s) for f In the definition of f : f x = x ^ 2 Typangabe f :: a->a ist zu allgemein: ^2 verlangt Einschränkung auf Zahlentypen (a Num). Abhilfe: Einführung des Kontextes Num a => Prelude> let { f :: Num a => a->a; f x = x^2 }
12 Funktionale Programmierung (WS2005/2006) 2/12 Die Typklasse der Zahlen (Num a) Prelude> let { square :: Num a => a->a; square x = x^2 } Prelude> square (2::Int) 4 Prelude> square Prelude> square ((Ratio.%) 2 3) rationale Zahl % 9 9 Prelude> square ((Complex.:+) 0 1) komplexe Zahl i (0 + 1i) (-1.0) : Prelude> square 2 Fehler: 2 ist ein Zeichen, keine Zahl <interactive>:1: No instance for (Num Char) arising from use of square at <interactive>:1 In the definition of it : it = square 2
13 Funktionale Programmierung (WS2005/2006) 2/13 Typdefinitionen statt Typfehlersuche (1) Kontexte können automatisch hergeleitet werden: Prelude> let square x = x^2 Prelude> :t square square :: forall a. (Num a) => a -> a Warum also den Typ angeben? Prelude> let sumup n = n*(n+1)/2 ohne Typangabe Prelude> sumup (10^20) 5.0e39 nicht exakt Prelude> sumup ((10^20)::Integer) Typfehler <interactive>:1: No instance for (Fractional Integer) arising from use of sumup at <interactive>:1 In the definition of it : it = sumup ((10^20) :: Integer) Wie kommt die Forderung nach Fractional zustande?
14 Funktionale Programmierung (WS2005/2006) 2/14 Typdefinitionen statt Typfehlersuche (2) Wie kommt die Forderung nach Fractional zustande? Prelude> let sumup n = n*(n+1)/2 Prelude> :t sumup forall a. (Fractional a) => a -> a Antwort: durch die Definition von sumup kann man früher erkennen! Prelude> let { sumup :: Integer->Integer; sumup n = n*(n+1)/2 } <interactive>:1: No instance for (Fractional Integer) arising from use of / at <interactive>:1 es liegt an / In the definition of sumup : sumup n = (n * (n + 1)) / 2 Lösung: Ersetze / durch ganzzahlige Division div (Typklasse Integral) Prelude> let {sumint :: Integral a => a->a; sumint n = n*(n+1) div 2} Prelude> sumint ((10^20)::Integer)
15 Funktionale Programmierung (WS2005/2006) 2/15 Typdefinitionen statt Typfehlersuche (3) 1. Man überlege sich den Typ jeder Funktion, bevor man sie implementiert. 2. Vergleich mit dem Typ, den der Haskell-Interpreter liefert. Generell: der Typ sollte möglichst allgemein sein (Wiederverwendung), aber es kann Einschränkungen durch den Algorithmus geben. Bereichsgrenzen: Integer statt Typklasse Integral Genauigkeit: Double statt Typklasse Fractional Bei komplizierten Funktionen kann der Haskell-Interpreter u.u. nicht in der Lage sein, den allgemeinsten Typ selbst herauszufinden. In dem Fall kann man den speziellen Typ angeben, den man braucht. Typfehlermeldung z.b.:...is not polymorphic enough. Für dieses Kapitel nicht prüfungsrelevant und abhängig von Interpreterversion, deshalb hier kein Beispiel.
16 Funktionale Programmierung (WS2005/2006) 2/16 Schrittweiser Entwurf 1. Plan der Struktur (meist nur gedanklich) < is_less x y if then else my_min x y 2. Angabe des Typs (unmöglich? Entwurfsfehler, zurück zu 1.) my min :: Double -> Double -> Double 3. Angabe der Funktionsgleichung my_min x y = let is_less = x<y in if is_less then x else y
17 Funktionale Programmierung (WS2005/2006) 2/17 1. if-then-else Fallunterscheidungen implies x y = if x then y else True 2. mehrere Gleichungen implies True y = y implies False _ = True 3. Guards implies x y x = y not x = True 4. case implies x y = case x of True -> y False -> True
18 Funktionale Programmierung (WS2005/2006) 2/18 if cond then x else y Syntax: Ausdruck, kann Teilausdruck sein, else-zweig muss vorhanden sein Bsp.: 7 + (if doubleit then (*2) else (*1)) x - y Typen: Typ(cond)=Bool, Typ(x)=Typ(y)=Typ(Gesamtausdruck) Semantik: 1. Falls cond =, Ergebnis (Nichttermination) 2. Falls cond = True, Ergebnis x 3. Falls cond = False, Ergebnis y Es wird nur ein Zweig ausgewertet, der Wert des anderen darf undefiniert sein (wichtig für den Abbruch einer Rekursion!)
19 Funktionale Programmierung (WS2005/2006) 2/19 Es gibt let und where, vorzugsweise Lokale Definitionen let, um die Schritte einer Berechnung zu verdeutlichen where, um einen Ausdruck näher zu spezifizieren Manchmal gibt es nur eine Möglichkeit: in einem Ausdruck nur let f x = x + 3 * (let z = x^3-5 in z*x+z) - 2 für mehrere Guards nur where intpow :: Double -> Integer -> Double intpow x n n<0 = 1 / pow x (-n) n>=0 = pow x n where pow x n = x^n
20 Funktionale Programmierung (WS2005/2006) 2/20 Bsp.: Nullstelle von ax 2 +bx+c root :: Double -> Double -> Double -> Bool -> Double root a b c chooselower = let p = b/a q = c/a disc = (p/2)^2-q rootd = sqrt disc in if disc < 0 then error "root: Diskriminante kleiner Null" else -p/2+(if chooselower then -rootd else rootd) root 1 1 (-2) False 1.0 root 1 1 (-2) True -2.0 root False *** Exception: root: Diskriminante kleiner Null rootd = sqrt disc nur Definition, wird erst bei Verwendung berechnet.
21 Funktionale Programmierung (WS2005/2006) 2/21 Der Layout-Stil von Haskell ohne Layout f x = let { y=x+1; z=y*y } in z mit Layout f x = let y=x+1 z=y*y in z Sinn: Programme leichter lesbar zu machen Zeilen gleicher Blöcke müssen in der gleichen Spalte beginnen Möglich bei let, where, case, etc. Für jeden Block separat anwendbar
22 Funktionale Programmierung (WS2005/2006) 2/22 Besonderheiten bei let-ausdrücken 1. Die Reihenfolge der Definitionen ist unwichtig 2. Es gilt die Definition aus dem innersten umschliessenden Block 3. Es wird nur das berechnet, was benutzt wird f x = let y = 4 lokaler Zahlenwert g w = w+y lokale Funktion z = let a = x+y (zu 1: y aus nächster Zeile) y = g x (g benutzt äusseres y) z = y-x (zu 2: y aus voriger Zeile) b = (zu 3: ignoriert) in z+x+(if g x > x then a else b) u = y+z (zu 2: y=4 aus erster Zeile) in u*u
23 Funktionale Programmierung (WS2005/2006) 2/23 Funktionen als Argumente Die Funktion restricted equal soll prüfen, ob ihre Argumente, die Funktionen f, g::int->int, auf der Menge {0,1,2,3} identisch sind. restricted_equal :: (Int->Int) -> (Int->Int) -> Bool restricted_equal f g = (f 0 == g 0) && (f 1 == g 1) && (f 2 == g 2) && (f 3 == g 3) Anmerkung: Zwei Polynome n-ten Grades sind gleich, wenn sie an n + 1 Stellen übereinstimmen. Wir prüfen die Gleichheit jeweils zweier Polynome dritten Grades: Test> let p1 x = x^3-1 Test> let p2 x = (x-1)*(x^2+x+1) Test> restricted_equal p1 p2 True
24 Funktionale Programmierung (WS2005/2006) 2/24 Eine Funktion als Ergebnis Die Funktion twice soll eine Funktion f::int->int bekommen und sie zweimal hintereinander anwenden. twice :: (Int->Int) -> (Int->Int) twice f = f. f Test: Test> (+1) 6 7 Test> let f = twice (+1) f entspricht (+2) Test> f 6 8 Test> let g = twice f g entspricht (+4) Test> g 6 10
25 Funktionale Programmierung (WS2005/2006) 2/25 Bsp.: Numerischer Differenzenoperator Typ: Funktion als Argument und als Ergebnis. diff :: (Double->Double) -> ( Double->Double ) diff f =...? hier müsste eine Funktion stehen Lösung: Wir definieren, wie sich die Funktion auf ihrem Argument verhält (extensionale Definition, war bei twice nicht nötig) diff f x = let h = 1.0e-10 in (f (x+h) - f x) / h Zusatzargument OK: zweites Klammernpaar im Typ unnötig. Test> let f x = sin x Test> let f = diff f Test> f f ist cos Warnung: (diff. diff) funktional möglich, aber numerisch falsch!
26 Funktionale Programmierung (WS2005/2006) 2/26 Tupel und Listen Struktur #Komponenten Komponententyp Typbsp. Tupel fest beliebig (Int,Bool) Liste beliebig fest [Double] Beispiele: (2,True)::(Integer,Bool) [1.2, e23, 67, 7.31, 3.2E-5]::[Double] [("inc",(+1)), ("double",(*2))]::[(string,int->int)]
27 Funktionale Programmierung (WS2005/2006) 2/27 Tupel Sei der Typ des Ausdrucks x i gleich α i ; dann gilt: Ausdruck Typ (x 0,x 1 ) (α 0,α 1 ) (x 0,x 1,x 2 ) (α 0,α 1,α 2 ) (x 0,x 1,x 2,x 3 ) (α 0,α 1,α 2,α 3 ) Verschieden geklammerte Tupel haben unterschiedliche Typen, obwohl die Mengen isomorph sind: ((α,β),γ) T yp (α,β,γ)
28 Funktionale Programmierung (WS2005/2006) 2/28 Pattern Matching zur Komponentenselektion Prinzip: Struktur (hier Tupel) auf der linken Seite einer Gleichung: fst (x,y) = x snd (x,y) = y Anwendung: (1) passe aktuellen und formalen Parameter (2) weise jeder Variablen den entsprechenden Teil zu Beispiele: proj_nachname_gehalt (_,(_,nachname),_,gehalt) = (nachname,gehalt) implies (True,False) = False Matching mit Konstanten implies _ = True in gegebener Reihenfolge
29 Funktionale Programmierung (WS2005/2006) 2/29 Tupel als Ergebnis von Funktionen Bsp.: Logikschaltung ha && /= fa x y z ha c0 s0 ha c1 s1 c s ha :: (Bool,Bool) -> (Bool,Bool) ha (x,y) = (x && y, x /= y) fa :: (Bool,Bool,Bool) -> (Bool,Bool) fa (x,y,z) = let (c0,s0) = ha (x,y) (c1,s1) = ha (s0,z) in (c0 c1, s1)
30 Funktionale Programmierung (WS2005/2006) 2/30 Listen Dynamische Datenstruktur mit Elementen gleichen Typs Erzeugt durch zwei Datenkonstruktoren Name Bedeutung Symbol Typ nil leere Liste [] α.[α] cons am Anfang anfügen (:) α.α [α] [α] cons meist als rechtsassoziierender Infixoperator benutzt Syntaktischer Zucker: [1,2,3,4] statt 1:2:3:4:[] Liste als Argument mit Pattern-Matching map :: (a->b) -> [a] -> [b] map f [] = [] map f (x:xs) = f x : map f xs Rekursion im Detail später
31 Funktionale Programmierung (WS2005/2006) 2/31 Wichtige Funktionen auf Listen Name Typ Beispiel null [a]->bool null [] True head [a]->a head [1,2,3,4] 1 tail [a]->[a] tail [1,2,3,4] [2,3,4] map (a->b)->[a]->[b] map (*2) [1,2,3] [2,4,6] length [a]->int length [1,3,5,7,9] 5 (++) [a]->[a]->[a] [1,2,3]++[4,5] [1,2,3,4,5] (!!) [a]->int->a [8,5,7,3]!! 1 5 take Int->[a]->[a] take 3 [4,5,6,7,8] [4,5,6] drop Int->[a]->[a] drop 3 [4,5,6,7,8] [7,8] concat [[a]]->[a] concat [[1,5],[],[3,7,2]] [1,5,3,7,2]
32 Funktionale Programmierung (WS2005/2006) 2/32 Arithmetische Sequenzen Ausdruck erzeugte Liste Schrittweite [1..5] [1,2,3,4,5] ohne Angabe: 1 [1,3..12] [1,3,5,7,9,11] 2 (Abstand 1,3) [4..2] [] 1, deshalb leere Liste [9,6..0] [9,6,3,0] -3 Arithmetische Ausdrücke möglich: let x=7 in [x..2*x] Auch für andere Aufzählungstypen: [False.. True] Abstand vor.. Sogar unendliche Listen lassen sich definieren und verwenden, aber es kann nur ein endlicher Präfix ausgegeben werden (take): Ausdruck erzeugte Liste take 9 [1..] [1,2,3,4,5,6,7,8,9] take 7 [4,2..] [4,2,0,-2,-4,-6,-8]
33 Funktionale Programmierung (WS2005/2006) 2/33 Unicode-Zeichen, Typ Char Zeichen und Strings import Char für viele Funktionen nötig Konstanten, Bsp.: a, \n, \112 Konversion mit Int: digittoint, inttodigit, ord, chr Zeichenart: isascii, isupper, islower, toupper, tolower Strings, Listen von Zeichen type String = [Char] Typsynonym Syntaktischer Zucker: "Hallo" statt [ H, a, l, l, o ] Sequenz: [ a, c.. o ] "acegikmo" show-funktion: (Show a) => a->string z.b. Float Show Bsp.: let x=27.5 in ("Preis: " ++ show x ++ " Euro")
34 Funktionale Programmierung (WS2005/2006) 2/34 List Comprehensions (1) Generierung von Listen, orientiert an Mengenkomprehension Bsp.: Pythagoräische Tripel = { (x, y, z) N 3 x 2 + y 2 = z 2 } Naive Implementierung mit Obergrenze n für die Zahlen: ptriple :: Integer -> [(Integer,Integer,Integer)] ptriple n = [ (x,y,z) Element der Ergebnisliste x <- [1..n], nimm nacheinander ein x y <- [1..n], für jedes x eine Folge von y z <- [1..n], für jedes x und y eine Folge von z x^2+y^2==z^2 akzeptiere Wahl von x,y,z, falls Bedingung gilt ] ptriple 15 [(3,4,5),(4,3,5),(5,12,13),(6,8,10),(8,6,10),(12,5,13)]
35 Funktionale Programmierung (WS2005/2006) 2/35 C: List Comprehensions (2) Ähnlichkeit zu verschachtelten for-schleifen count=0; for (i=a;i<=b;i++) if (p(i)) { limit = f(i); for (j=0;j<=limit;j++) result[count++] = exp(i,j); } Haskell: result = [ exp (i,j) i<-[a..b], p i, let limit = f i, j <- [0..limit] ]
36 Funktionale Programmierung (WS2005/2006) 2/36 List Comprehensions (3) Syntax: [ exp q 0,..., q n ] wobei exp Element der Ergebnisliste, q i Qualifier Semantik: Erzeugen eines Entscheidungsbaums von Variablenbindungen, die Ebenen sind q 0,q 1..q n,exp; Ergebnis: Liste der Werte von exp an den Blättern Arten von Qualifiern Generator: P attern <- Liste für jedes Listenelement: falls Patternmatch erfolgreich: neuer Teilbaum mit Bindung der Variablen im Pattern. Bsp. (True,x) <- [(True,4),(False,7),(True,2)] erzeugt zwei Teilbäume mit den Bindungen x=4 und x=2. Guard: boolescher Ausdruck ( False: abschneiden des Teilbaums) Lokale Definition: let pattern = expression (kein in)
37 Funktionale Programmierung (WS2005/2006) 2/37 Beispiel: [(i,j,k) i< [2..6], even i, let k=i*i, k>10, j< [1..k mod 7]] i< [2..6] i< [2..6] i=2 i=3 i=4 i=5 i=6 even i True False True False True let k=i*i k=4 k=16 k=36 k>10 False True True j< [1..k mod 7] j< [1..2] j< [1..1] j=1 j=2 j=1 (i,j,k) (4,1,16) (4,2,16) (6,1,36) Ergebnis: [(4,1,16),(4,2,16),(6,1,36)]
38 Funktionale Programmierung (WS2005/2006) 2/38 Semantik von List Comprehensions Gegeben durch eine induktive Definition. Q steht für eine Folge von Qualifiern, e für einen Ausdruck, b für einen booleschen Ausdruck, p für ein Pattern, l für eine Liste und decls für eine Folge von Deklarationen. 1. Leere Liste von Qualifiern (nur intern) [ e ] = [ e ] 2. Guard [ e b, Q ] = if b then [ e Q ] else [] 3. Generator (ok sei eine frische Variable) [ e p <- l, Q ] = let ok p = [ e Q ] ok _ = [] in concat (map ok l) 4. let-zuweisung [ e let decls, Q ] = let decls in [ e Q ]
39 Funktionale Programmierung (WS2005/2006) 2/39 Polymorphie, Overloading und Typklassen Polymorphie: Typunabhängigkeit Bsp.: length :: [a] -> Int unabhängig vom Typ von a Overloading: ein Name für verschiedene Funktionen (+ Z, + Q ) Bsp: (+) :: (Num a) => a -> a -> a (+) ist nur auf Elementen der Typklasse Num definiert Typklasse: Zusammenfassung von Typen, die dieselben überladenen Funktionen verwenden Bsp.: Num, auf ihren Elementen ist (+), (-) und (*) definiert Elemente von Num: Int, Integer, Float, Double, Rational...
40 Funktionale Programmierung (WS2005/2006) 2/40 Polymorphe Funktion Mindestens eine und nur unbeschränkte Typvariablen. Keine Typ-spezifischen Operationen auf den Elementen mit polymorphen Typen. Funktion folgt manchmal bereits aus der Typdefinition: Typ a->a (a,b)->a a->b->a einzige totale Funktion id fst const Implementierung verwaltet polymorphe Daten nur, aber verknüpft sie nicht. Beispiel: my_replicate :: Int -> a -> [a] my_replicate n x = [ x _ <- [1..n] ] Jedes Elemente der Ergebnisliste enthält einen Verweis auf das Datenobjekt x.
41 Funktionale Programmierung (WS2005/2006) 2/41 Überladene Funktion Mindestens eine beschränkte Typvariable vorhanden. Operationen auf den Elementen der beschränkten Typvariablen 1. direkt durch Verwendung einer Operation einer niedrigeren Softwareschicht oder einer Hardware-Operation; Implementierung durch Spezialisierung (+)::Int, z.b. Maschinenbefehl für arithmetisch-logische Einheit (ALU) (+)::Float, z.b. Maschinenbefehl für Gleitpunkt-Prozessoreinheit (+)::Integer, z.b. Verwendung einer Funktion der GNU-Multiple-Precision-Library 2. indirekt durch Verwendung anderer überladener Funktionen; Implementierung durch Typinformation in Laufzeitdaten und Fallunterscheidungen beim Übergang zu (1.) zur Vermeidung explosiver Codeduplikation keine Spezialisierung
42 Funktionale Programmierung (WS2005/2006) 2/42 Einige vordefinierte Typklassen in Haskell Name El.-Eigenschaft Bsp.-Fkt. Elemente Show anzeigbar show alle ausser IO, -> Read lesbar read alle ausser IO, -> Eq vergleichbar (==) alle ausser IO, -> Ord geordnet (<) alle ausser IO, -> Num Zahl (+) Int, Float,... Enum aufzählbar [..] Bool, Int, Char,... Integral ganzzahlig mod Int, Integer Fractional invertierbar (/) Float, Double
43 Funktionale Programmierung (WS2005/2006) 2/43 Vordefiniertes Typklassensystem in Haskell
44 Funktionale Programmierung (WS2005/2006) 2/44 Typsynonyme (type) ein anderer Name für den gleichen Typ Bsp.: type IndexValue = (Int,Int) für Index/Wert-Paare Vorteil: Die Typinformation enthält impliziten Kommentar. Nachteil: logische Fehler werden so nicht automatisch erkannt. type Point = (Int,Int) Point kann anstelle von IndexValue verwendet werden. Abhilfe: algebraische Datentypen (data) Index und Wert können unerkannt vertauscht werden. Abhilfe: Namen für Komponenten (labelled fields) Sinnvolle Verwendung von type als Abkürzung ohne spezielle Bedeutung: type DoubleV4 = (Double,Double,Double,Double)
45 Funktionale Programmierung (WS2005/2006) 2/45 Algebraische Datentypen (data) Konstruktion eines neuen Typs, ungleich aller bestehenden Bsp.: vordefinierter Typ Bool data Bool Typkonstruktor = False erster Datenkonstruktor True zweiter Datenkonstruktor deriving automatische Herleitung von Typklasseninstanzen (Eq, Ord, Enum, Read, Show, Bounded) Eq Ord False==True False False<True True Enum fromenum True 1 Read read "False" :: Bool False Show show True "True" Bounded maxbound::bool True
46 Funktionale Programmierung (WS2005/2006) 2/46 data: Datenkonstruktoren mit Typen als Argumente data Temperature Name des neuen Typs = Celsius Double Datenkonstruktor Celsius, ein Argument Kelvin Double Datenkonstruktor Kelvin, ein Argument Fahrenheit Double Datenkonstruktor Fahrenheit, ein Argument deriving Show Ableitung der show-funktion normalize :: Temperature -> Temperature normalize (Celsius cel) = Kelvin (cel ) normalize (Kelvin kel) = Kelvin kel normalize (Fahrenheit fah) = normalize (Celsius ((fah-32)*5/9)) Die Normalisierungsfunktion kann nur auf Elemente vom Typ Temperature angewendet werden und der Tag (Celsius/Kelvin/Fahrenheit) ist zwingend für die Implementierung so ist immer sofort erkennbar, in welcher Einheit ein Wert angegeben ist.
47 Funktionale Programmierung (WS2005/2006) 2/47 data: Typkonstruktoren mit Typparametern Bsp.: vordefinierter Typkonstruktor Maybe data Maybe a = Nothing Just a deriving (Eq,Ord,Read,Show) [("Bill",Nothing),("Peter",Just 2.0), ("Tom",Just 1.2)] :: [(String, Maybe Double)] Datenkonstruktoren sind eine Art von Funktionen: Nothing :: forall a. Maybe a Just :: forall a. a -> Maybe a
48 Funktionale Programmierung (WS2005/2006) 2/48 data: Verwendung eines Kontextes Aufgabe: Verzeichnis als Liste von Schlüssel/Wert-Paaren. Forderungen: Schlüssel müssen vergleichbar sein Klasse Eq Schlüssel und Einträge sollen angezeigt werden können Klasse Show data (Eq a, Show a, Show b) => Dictionary a b = Dict [(a,b)] Kontext lookupdict :: (Eq a, Show a, Show b) => a -> Dictionary a b -> String lookupdict key (Dict xs) = case lookup key xs of Nothing -> "key " ++ show key ++ " not found" Just x -> show x In Haskell vordefiniert: lookup :: (Eq a) => a -> [(a, b)] -> Maybe b
49 Funktionale Programmierung (WS2005/2006) 2/49 data: Labelled Fields Definition des Datentyps mit den Komponenten: data Person = Customer { name::string, address::string } Employee { name::string, salary::float } Erzeugung eines neuen Elements des Datentyps: employee = Employee { name="schmidt", salary= } Abfragen eines Komponentenwerts: salary employee Pattern-Matching mit Komponentenzuweisung an lokale Variablen n und s printperson (Employee {name=n, salary=s}) = "Angestellter " ++ n ++ ", Gehalt: " ++ show s Kopie mit Änderung einer einzelnen Komponente (@: as-pattern) changeaddress :: Person -> String -> Person changeaddress person@(customer {}) newaddress = person {address=newaddress}
50 Funktionale Programmierung (WS2005/2006) 2/50 Deklaration neuer Typklassen class [ Kontext =>] Klassenname where Typdeklaration der Methoden Default-Definitionen Bsp. (Num aus der Prelude): class Eq a where ein Typ a gehört zur Klasse Eq, gdw. (==), (/=) :: a -> a -> Bool Gleichheit ist auf a definiert x /= y = not (x==y) Default-Definitionen x == y = not (x/=y)
51 Funktionale Programmierung (WS2005/2006) 2/51 Deklaration neuer Instanzen instance [ Kontext => ] Klassenname Instanztyp where Implementierung der Methoden Bsp.: es sei definiert: data Color = Red Yellow Green instance Eq Color where Red == Red = True Yellow == Yellow = True Green == Green = True == = False Color sei eine Instanz von Eq In einfachen Fällen automatisch mit deriving: data Color = Red Yellow Green deriving Eq
52 Funktionale Programmierung (WS2005/2006) 2/52 Klasse Num aus der Prelude class (Eq a, Show a) Kontext (Superklassen) => Num a where neue Klasse für Typ a (+), (-), (*) :: a -> a -> a Signatur negate :: a -> a abs, signum :: a -> a frominteger :: Integer -> a -- Minimal complete definition: -- All, except negate or (-) x - y = x + negate y Default-Definitionen negate x = 0 - x
53 Funktionale Programmierung (WS2005/2006) 2/53 Complex als Instanz von Num (Modul Complex) Syntax einer komplexen Zahl: <Realteil>:+<Imaginärteil> instance (RealFloat a) a kann Float oder Double sein => Num (Complex a) where Klassenname Elementtyp (x:+y) + (x :+y ) = (x+x ) :+ (y+y ) (x:+y) - (x :+y ) = (x-x ) :+ (y-y ) (x:+y) * (x :+y ) = (x*x -y*y ) :+ (x*y +y*x ) negate (x:+y) = negate x :+ negate y abs z = magnitude z :+ 0 signum 0 = 0 signum z@(x:+y) = x/r :+ y/r where r = magnitude z frominteger n = frominteger n :+ 0
54 Funktionale Programmierung (WS2005/2006) 2/54 Ratio als Instanz von Num (Modul Ratio) Syntax einer rationalen Zahl: <Zähler>%<Nenner> Infix-Konstruktor :% wird nicht automatisch exportiert instance (Integral a) Kontext, a muss eine ganze Zahl sein => Num (Ratio a) where Klassenname Elementtyp (x:%y) + (x :%y ) = reduce (x*y + x *y) (y*y ) (x:%y) * (x :%y ) = reduce (x * x ) (y * y ) negate (x:%y) = (-x) :% y abs (x:%y) = abs x :% y signum (x:%y) = signum x :% 1 frominteger x = frominteger x :% 1
55 Funktionale Programmierung (WS2005/2006) 2/55 Rekursive Instanzdeklarationen Bsp.: Gleichheit für Listen instance Eq a => Eq [a] where [] == [] = True (x:xs) == (y:ys) = x==y && xs==ys == = False Bsp.: Gleichheit für Paare instance (Eq a, Eq b) => Eq (a,b) where (x,y) == (x,y ) = x==x && y==y
56 Funktionale Programmierung (WS2005/2006) 2/56 Arithmetische Sequenzen für boolesche Tupel instance (Bounded a, Bounded b, Enum a, Enum b) => Enum ((,) a b) where fromenum (x,y) = fromenum x * (1+fromEnum (maxbound::b) -fromenum (minbound::b)) + fromenum y toenum i = let size = 1 + fromenum (maxbound::b) - fromenum (minbound::b) in (toenum (i div size), toenum (i mod size)) Test: [(False,(False,False))..(True,(True,True))] [(False,(False,False)),(False,(False,True)), (False,(True,False)),(False,(True,True)), (True,(False,False)),(True,(False,True)), (True,(True,False)),(True,(True,True))]
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........................................
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
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
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
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
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
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
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
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
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)]
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,
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
Listen und Listenfunktionen. Grundlagen der Programmierung 2 A (Listen) Listen und Listenfunktionen. Listen? Haskell: Listen
Listen und Listenfunktionen Grundlagen der Programmierung 2 A (Listen) Haskell: Listen Prof. Dr. Manfred Schmidt-Schauß Listen modellieren Folgen von gleichartigen, gleichgetypten Objekten. Ausdruck im
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
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
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
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
Typklassen und Überladung in Haskell
Typklassen und Überladung in Haskell Überladung: Es gibt mehrere Funktionen mit gleichem Namen. der Typ der Argumente bestimmt, welche gemeint ist. (1; i) + (3; 2i) statt (1, i) complexadd (3; 2i). Haskell-Typklassen:
Funktionale Programmierung ALP I. Algebraische Datentypen und Abstrakte Datentypen. SS 2013 Prof. Dr. Margarita Esponda. Prof. Dr.
Funktionale Programmierung AP I Algebraische Datentypen und Abstrakte Datentypen SS 2013 Abstrakt Datentypen Beispiel: Algebraischen Datentypen für Bäume data SBTree = SBTree SBTree AP I: Margarita Esponda,
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
Einführung in die Funktionale Programmierung mit Haskell
Einführung in die Funktionale Programmierung mit Haskell Typklassen und Polymorphie LFE Theoretische Informatik, Institut für Informatik, Ludwig-Maximilians Universität, München 23. Mai 2013 Planung Freitag:
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
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
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
Gliederung. Algorithmen und Datenstrukturen I. Listen in Haskell: Listen in Haskell: Listen in Haskell. Datentyp Liste Strings Listenkomprehension
Gliederung Algorithmen und Datenstrukturen I D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg 1 Winter 2009/10, 16. Oktober 2009, c
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
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
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
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
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
Grundlagen der Programmierung 2 (1.A)
Grundlagen der Programmierung 2 (1.A) Prof. Dr. Manfred Schmidt-Schauÿ Künstliche Intelligenz und Softwaretechnologie 18. April 2007 Grundlagen der Programmierung 2: Geplanter Inhalt der ersten Hälfte
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
Funktionale Programmierung. Das Funktionale Quiz. Das Funktionale Quiz. Das Funktionale Quiz
Funktionale Programmierung Das Funktionale Quiz 31.5.2005 Nenne eine Gemeinsamkeit zwischen Typklassen und OO-Klassen Das Funktionale Quiz Das Funktionale Quiz Nenne einen Unterschied zwischen Typklassen
Haskell, Typen, und Objektorientierung
Haskell, Typen, und Objektorientierung ZIELE dieses Kapitels Haskells Typisierung Milners Polymorpher Typcheck Haskells Typklassen P raktische Informatik 2, SS 2005, F olien Kap.3, (27. Mai2005) Seite
Grundlagen der Programmierung 2 (1.A)
Grundlagen der Programmierung 2 (1.A) Einführung Prof. Dr. Manfred Schmidt-Schauß Sommersemester 2015 Grundlagen der Programmierung 2 Geplanter Inhalt der ersten Hälfte: Programmieren in Haskell Definitionen;
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)
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
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?
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
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 =
October 29, Universität Bielefeld AG Praktische Informatik. Programmieren in Haskell. Stefan Janssen. Typ-Synonyme. Algebraische Datentypen
Universität Bielefeld AG Praktische Informatik October 29, 2014 Typsynonyme Neue Typnamen durch Typsynonyme: 1 type Pair a b = (a,b) 2 type Triple a b c = (a,b,c) 3 type OrdList a = [ a] definiert neue
Programmieren in Haskell Das Haskell Typsystem
Programmieren in Haskell Das Haskell Typsystem Peter Steffen Robert Giegerich Universität Bielefeld Technische Fakultät 22.01.2010 1 Programmieren in Haskell Belauscht... Lisa Lista: Ohne Typen keine korrekten
Crashkurs: Haskell. Mentoring FU Berlin Felix Droop
Crashkurs: Haskell Mentoring FU Berlin 7.11.2018 Felix Droop Crashkurs Haskell 1. GHCi Umgebung
Hallo Haskell. Funktionale Programmierung. Prof. Dr. Oliver Braun Letzte Änderung: :06. Hallo Haskell 1/23
Hallo Haskell Funktionale Programmierung Prof. Dr. Oliver Braun Letzte Änderung: 15.10.2018 07:06 Hallo Haskell 1/23 Glasgow Haskell Compiler (GHC) der Haskell-Compiler ist der GHC Sie installieren ihn
Funktionale Programmierung und Typtheorie
Funktionale Programmierung und Typtheorie 5. Fortgeschrittene Konzepte 5.1 Komprehensionen 5.2 Partielle Applikationen 5.3 Strikte und nichtstrikte Funktionen 5.4 Unendliche Datenstrukturen und verzögerte
Grundlagen der Programmierung 2 (1.A)
Grundlagen der Programmierung 2 (1.A) Einführung Prof. Dr. Manfred Schmidt-Schauß Sommersemester 2017 Grundlagen der Programmierung 2 Geplanter Inhalt der ersten Hälfte: Programmieren in Haskell Definitionen;
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
Vorsemesterkurs Informatik Sommersemester Aufgabenblatt Nr. 5A. Lösung zu Aufgabe 1 (Fehler in Haskell-Quelltext: Parsefehler)
Fachbereich Informatik und Mathematik Institut für Informatik Vorsemesterkurs Informatik Sommersemester 2017 Aufgabenblatt Nr. 5A zu Aufgabe 1 (Fehler in Haskell-Quelltext: Parsefehler) Laden Sie von der
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
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
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
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
