Grundlegende Datentypen

Ähnliche Dokumente
Funktionale Programmierung Grundlegende Datentypen

Grundlegende Datentypen

Grundlegende Datentypen

Funktionale Programmierung Mehr funktionale Muster

Programmieren in Haskell Einstieg in Haskell

Programmieren in Haskell

Einführung in die funktionale Programmierung

Programmieren in Haskell

Prüfung Funktionale Programmierung

Vorsemesterkurs Informatik

Prüfung Funktionale Programmierung

Paradigmen der Programmierung

Basiskonstrukte von Haskell

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

Haskell. (Compiler) Prof. Dr. Oliver Braun. Letzte Änderung: :58. Haskell 1/28

Grundlagen der Programmierung 3 A

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

ALP I. Funktionale Programmierung

Crashkurs: Haskell. Mentoring FU Berlin Felix Droop

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

Einführung in Haskell

Grundlagen der Programmierung 3 A

WS 2011/2012. Robert Giegerich. October 30, 2013

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

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

Typklassen. Natascha Widder

WS 2011/2012. Georg Sauthoff 1. October 18, 2011

Grundlagen der Programmierung 2 (2.A)

Vorsemesterkurs Informatik

Programmierkurs II. Typsynonyme & algebraische Datentypen

WS 2011/2012. Robert Giegerich. October 17, 2012

ALP I. Funktionale Programmierung

Hallo Haskell. Funktionale Programmierung. Prof. Dr. Oliver Braun Letzte Änderung: :06. Hallo Haskell 1/23

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

Hallo Haskell. (Funktionale Programmierung) Prof. Dr. Oliver Braun. Letzte Änderung: :08. Hallo Haskell 1/23

Einführung in die Informatik 2

Grundlagen der Programmierung 2 A (Listen)

Kapitel 3: Eine einfache Programmiersprache. Programmieren in Haskell 1

Grundlagen der Programmierung 2 (1.A)

Programmieren in Haskell

Grundlagen der Programmierung 2 (1.A)

Typ-Polymorphismus. November 12, 2014

ProInformatik: Funktionale Programmierung. Punkte

WS 2011/2012. Georg Sauthoff 1. October 26, 2011

Vorsemesterkurs Informatik

Programmieren in Haskell

Programmieren in Haskell

Monoide. Funktionale Programmierung. Prof. Dr. Oliver Braun Letzte Änderung: :54. Monoide 1/16

Programmieren in Haskell Das Haskell Typsystem

Grundlagen der Programmierung 2

Praktische Informatik 3

Haskell. Grundlagen der Programmierung 2. Grundlagen der Programmierung 2 (1.A) Bücher, Literatur, URLs. Haskell. Einführung

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

Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zur Übungsklausur -

Grundlagen der Programmierung 2 (1.C)

11 Fallstudie: Reguläre Ausdrücke

WS 2011/2012. Georg Sauthoff 1. November 11, 2011

Haskell for Hackers... or why functional programming matters

Haskell. Grundlagen der Programmierung 2. Grundlagen der Programmierung 2: Geplanter Inhalt der ersten Hälfte. Prof. Dr. Manfred Schmidt-Schauß

Grundlagen der Programmierung 2 (1.A)

Einführung in die Informatik 2

Funktionale Programmierung. Monoide. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

Grundlagen der Programmierung 2

Gliederung. Algorithmen und Datenstrukturen I. Listen in Haskell: Listen in Haskell: Listen in Haskell. Datentyp Liste Strings Listenkomprehension

Algorithmen und Programmieren 1 Funktionale Programmierung - Musterlösung zu Übung 4 -

ALP I Einführung in Haskell

Was bisher geschah. deklarative Programmierung. funktionale Programmierung (Haskell):

Workshop Einführung in die Sprache Haskell

Anwendung (2. Versuch:-) Entkopplung der Locks

Grundlagen der Programmierung 2 (1.A)

5.3 Auswertung von Ausdrücken

Beschreibung von Werten: Beschreibung von Werten: (2) Begriffsklärung: (Ausdruck, expression) (2) Begriffsklärung: (Ausdruck, expression)

Tag 7. Pattern Matching und eigene Datentypen

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

Informatik I - Programmierung Globalübung Hugs98 Currying. Hugs98 Currying

Einführung in die Funktionale Programmierung mit Haskell

Funktionale Programmierung mit Haskell

Manuel M. T. Chakravarty Gabriele C. Keller Einführung in die Programmierung mit Haskell

Polymorphie und Funktionen höherer Ordnung

Proinformatik Marco Block Dienstag, den 21. Juli 2009

Funktionale Programmierung. Monaden. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

Funktionale Programmierung und Typtheorie

Einführung in die Funktionale Programmierung mit Haskell

Funktionale Programmierung

Beispiele: (Funktionen auf Listen) (3) Bemerkungen: Die Datenstrukturen der Paare (2) Die Datenstrukturen der Paare

WS 2012/2013. Robert Giegerich. 21. November 2012

Abstraktion mittels Polymorphie und Funktionen höherer Ordnung. Abschnitt 3.3. Polymorphie und Funktionen höherer Ordnung. Unterabschnitt 3.3.

WS 2011/2012. Georg Sauthoff 1. November 1, 2011

Kapitel 6: Abstraktion. Programmieren in Haskell 1

Zahlen in Haskell Kapitel 3

2.5 Listen. Kurzschreibweise: [42; 0; 16] Listen werden mithilfe von [] und :: konstruiert.

Funktionale Programmierung

Grundprinzipien der funktionalen Programmierung

Programmierkurs II. Einführung in die deklarative Programmiersprache HASKELL

Transkript:

Grundlegende Datentypen (Funktionale Programmierung) Prof. Dr. Oliver Braun Letzte Änderung: 18.03.2018 21:08 Grundlegende Datentypen 1/16

Typen in Haskell ist alles streng typisiert Haskell verfügt über einen Typinferenz-Mechanismus, der den Typ berechnet im GHCi können Sie sich den Typ für jeden beliebigen (korrekten) Ausdruck anzeigen lassen Beipiele: Prelude> :t 'a' 'a' :: Char Prelude> :t "Hallo" "Hallo" :: [Char] Grundlegende Datentypen 2/16

print vs. putstr Werte aller Typen die in der Typklasse Show sind, können mit print ausgegeben werden, z.b. Prelude> print 'a' 'a' Prelude> print 2 2 Prelude> print "Hallo" "Hallo" ausschließlich Strings können mit putstr ausgegeben werden Prelude> putstrln "Hallo" Hallo Beachten Sie den Unterschied in der Ausgabe von Hallo Grundlegende Datentypen 3/16

String-Konkatenation einzeln mit (++) :: String -> String -> String Prelude> "Hallo" ++ " " ++ "Welt" ++ "!" "Hallo Welt!" oder eine Liste mit concat :: [String] -> String Prelude> concat ["Hallo", " ", "Welt", "!"] "Hallo Welt!" Grundlegende Datentypen 4/16

Listen-Konkatenation (++) und concat kann aber noch mehr betrachten wir die Typen 1 (++) :: [a] -> [a] -> [a] concat :: [[a]] -> [a] d.h. wir können die beiden Funktionen auf Listen beliebiger Typen anwenden Prelude> [1,2,3] ++ [4,5] [1,2,3,4,5] Prelude> concat [[1, 2], [3, 4, 5], [6, 7]] [1,2,3,4,5,6,7] 1 Der Typ von concat ist sogar allgemeiner, aber dazu später mehr Grundlegende Datentypen 5/16

Strenge Typisierung aber nie gemischt: Prelude> "hello" ++ [1, 2, 3] <interactive>:14:13: No instance for (Num Char) arising from the literal 1 In the expression: 1 In the second argument of (++), namely [1, 2, 3] In the expression: "hello" ++ [1, 2, 3] Grundlegende Datentypen 6/16

Mehr Listenfunktionen cons: (:) :: a -> [a] -> [a] head tail take, drop (!!) Grundlegende Datentypen 7/16

Datentypen definieren neue Datentypen werden in Haskell mit dem Schlüsselwort data definiert beispielsweise wird in der Standardbilbliothek definiert: data Bool = False True Bool ist der Typkonstruktor der z.b. in Typsignaturen auftaucht False und True sind Datenkonstruktoren das Pipe-Symbol zeigt an, dass es sich bei Bool um einen sog. Summentypen (sum type) handelt ein Wert vom Typ Bool ist entweder False oder True Grundlegende Datentypen 8/16

Numerische Typen Typklasse Integral Int ganze Zahlen, feste Länge Integer ganze Zahlen, beliebig groß/klein Typklasse Fractional Float, Double as usual Ratio Brüche (in Data.Ratio) Scientific speichereffiziente, nahezu beliebig genaue Zahlen (im Package scientific) alle sind gemeinsam in der Typklasse Num Grundlegende Datentypen 9/16

Typklassen Typklassen sind dazu da um Funktionen zu überladen in den Typsignaturen können sog. Typconstraints angegeben werden, z.b. (/) :: Fractional a => a -> a -> a das bedeutet die Funktion (/) kann auf Werte aller Typen a angewendet werden mit der Einschränkung, dass a in der Typklasse Fractional ist d.h. insbesondere (/) kann nicht auf Int und Integer angewendet werden, dazu gibt es in Haskell die Funktionale div :: Integral a => a -> a -> a Grundlegende Datentypen 10/16

Werte vergleichen um Werte auf Gleichheit zu vergleichen, gibt es in Haskell die Funktionen (==) :: Eq a => a -> a -> Bool (/=) :: Eq a => a -> a -> Bool die Relationen <, <=, sind in der Typklasse Ord, z.b. (>=) :: Ord a => a -> a -> Bool Grundlegende Datentypen 11/16

if-then-else als Ausdruck Haskell hat keine Kontrollstrukturen if-then-else ist in Haskell als Ausdruck (expression) verfügbar, z.b. if x == 3 then "three" else "not three" analog zu ternärem Operator?: in vielen anderen Programmiersprachen Grundlegende Datentypen 12/16

Tupel (1/2) Tupel kombinieren zwei oder mehr Werte zu einem Tupel-Wert Datendefinition für 2-Tupel: data (,) a b = (,) a b der Typkonstruktor hat zwei Typen als Parameter, d.h. er konstruiert auf Typebene aus zwei Typen einen neuen Typ ein Tupel ist ein sog. Produkttyp, d.h. wir benötigen Werte von beiden Typen a und bum einen Wert vom Typ (,) a b zu erzeugen Anmerkung: Üblicherweise schreiben wir die Werte und auch die Typen innerhalb der Klammern: (True, "Hallo") :: (Bool, String) Grundlegende Datentypen 13/16

Tupel (2/2) für 2-Tupel gibt es die Funktionen fst :: (a, b) -> a snd :: (a, b) -> b auf die Komponenten von Tupeln greifen wir üblicherweise mit sog. Pattern Matching zu, z.b. tupfunc :: (Int, [a]) -> (Int, [a]) -> (Int, [a]) tupfun (a, b) (c, d) = ((a + c), (b ++ d)) Grundlegende Datentypen 14/16

Listen Listen sind ein weiterer first-class Containertyp in Haskell Listen enthalten beliebig viele Werte des selben Typs Tupel enthalten eine feste Anzahl Werte (potentiell) verschiedener Typen selbstverständlich kann beides kombiniert werden, z.b. (True, [ (1, "Hallo"), (2, " "), (3, "Welt"), (4, "!") ] ) :: Num a => (Bool, [(a, [Char])]) Grundlegende Datentypen 15/16

Listenkomprehension Haskell bietet mit der Listenkomprehension eine Notation für Listen, die an die Mengenkomprehension der Mathematik angelehnt ist Beispiel für Mengenkomprehension: {(x, y) x {1,..., 10}, y {x,..., 10}, 2 x =y} in Haskell: [ ( x, y) x <- [1..10], y<-[x..10], 2 * x /= y ] obiges Beispiel zeigt außerdem, dass in Haskell Listen durch die Verwendung von.. kürzer geschrieben werden können Grundlegende Datentypen 16/16