Grundlegende Datentypen

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

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

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

Tutorium - Haskell in der Schule. Ralf Dorn - Dennis Buchmann - Felix Last - Carl Ambroselli

Programmieren in Haskell

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

ALP I Einführung in Haskell

Funktionale Programmierung mit Haskell. Jan Hermanns

Funktionale Programmierung mit Haskell

Grundprinzipien der funktionalen Programmierung

Funktionale Programmierung mit Haskell

Zahlen in Haskell Kapitel 3

Crashkurs Haskell Mentoring WiSe 2016/17. Anja Wolffgramm Freie Universität Berlin

Tag 7. Pattern Matching und eigene Datentypen

Funktionale Programmierung

Typdeklarationen. Es gibt in Haskell bereits primitive Typen:

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

Funktionale Programmiersprachen

Was bisher geschah Funktionale Programmierung in Haskell: Algebraische Datentypen Pattern Matching Polymorphie Typklassen Rekursive Datentypen:

CGI Programmierung mit Ha. Markus Schwarz

Grundlagen der Programmierung 2 (1.C)

Programmieren in Haskell

Programmieren in Haskell

Programmtransformationen und Induktion in funktionalen Programmen

Einführung in die funktionale Programmierung

Einleitung Entwicklung in C Hello-World! Konstrukte in C Zusammenfassung Literatur. Grundlagen von C. Jonas Gresens

Funktionale Programmierung

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Definieren Sie eine Funktion circlearea zur Berechnung der Fläche eines Kreises mit gegebenen Radius (Float).

Programmierung WS12/13 Lösung - Übung 1 M. Brockschmidt, F. Emmes, C. Otto, T. Ströder

Programmieren in Haskell Einführung

ALP I. Funktionale Programmierung

Escher funktionale und logische Programmierung

Kurze Einführung in die Programmiersprache C++ und in Root

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

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

Methoden (fortgeschritten) in C# - 1

Proseminar Funktionales Programmieren. Stephan Kreutzer

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

Funktionale Programmierung mit Haskell

Eine Einführung in die funktionale Programmierung mit Haskell

Programmieren in Haskell Programmiermethodik

JavaScript. Dies ist normales HTML. Hallo Welt! Dies ist JavaScript. Wieder normales HTML.

Proseminar: Perlen der Informatik II Haskell List comprehensions & Typklassen

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 1

Generische Record-Kombinatoren mit statischer Typprüfung

THE GO PROGRAMMING LANGUAGE. Michael Karnutsch & Marko Sulejic

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

Algorithmen & Programmierung. Ausdrücke & Operatoren (1)

Funktionale Programmierung Blatt 1

Datentypen. Agenda für heute, 4. März, Pascal ist eine streng typisierte Programmiersprache

Vorlesung Programmieren

Agenda. 1 Einleitung. 2 Binäre Bäume. 3 Binäre Suchbäume. 4 Rose Trees. 5 Zusammenfassung & Ausblick. Haskell Bäume. Einleitung.

Elementare Konzepte von

Typklassen, Eingabe und Monaden In Haskell

Funktionen höherer Ordnung

Heutiges Thema... Datenstrukturen in Haskell... Algebraische Datentypen (data Tree =...) Typsynonyme (type Student =...)

FachPraktikum 1590 Erweiterbare Datenbanksysteme. Aufgaben Phase 1

Python Programmieren. Variablen, Ausdrücke und Anweisungen

Funktionale Programmierung

Kapitel 2: Grundlegende Elemente der Sprache Haskell

Primitive Datentypen und Felder (Arrays)

Tag 8. Beispiel: Tabellen formatieren

C.3 Funktionen und Prozeduren

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

JAVA - Methoden

19. Funktional-reaktive Programmierung

Einstieg in die Informatik mit Java

Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe

Die Programmiersprache C Eine Einführung

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

1.2 Attribute und Methoden Aufbau einer Java-Klasse:

Kapitel 3: Programmierung mit Kombinatoren

Funktionale Programmierung mit C++

Einführung in die Programmierung Laborübung bei Korcan Y. Kirkici. 3.Übung bis

Grundlagen der Programmierung

Verträge für die funktionale Programmierung Design und Implementierung

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick Parameterübergabe...

2.5 Primitive Datentypen

Grundlagen. Die Komponenten eines C Programms. Das erste Programm

1. Typen und Literale (6 Punkte) 2. Zuweisungen (6 = Punkte)

Transkript:

Funktionale Programmierung Grundlegende Datentypen Fakultät für Informatik und Mathematik Hochschule München Letzte Änderung: 14.11.2017 15:37 Inhaltsverzeichnis Typen........................................ 1 print vs. putstr.................................. 2 String-Konkatenation................................ 2 Listen-Konkatenation................................ 3 Strenge Typisierung................................ 3 Mehr Listenfunktionen............................... 3 Datentypen definieren............................... 4 Numerische Typen................................. 4 Typklassen..................................... 4 Werte vergleichen.................................. 5 if-then-else als Ausdruck............................ 5 Tupel........................................ 5 Listen........................................ 6 Listenkomprehension................................ 6 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 1

Beipiele: Prelude> :t 'a' 'a' :: Char Prelude> :t "Hallo" "Hallo" :: [Char] 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 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!" Letzte Änderung: 14.11.2017 15:37 2

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] 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] Mehr Listenfunktionen cons: (:) :: a -> [a] -> [a] head tail take, drop (!!) 1 Der Typ von concat ist sogar allgemeiner, aber dazu später mehr Letzte Änderung: 14.11.2017 15:37 3

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 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 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 Letzte Änderung: 14.11.2017 15:37 4

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 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 Tupel 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) 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)) Letzte Änderung: 14.11.2017 15:37 5

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])]) Listenkomprehension Haskell bietet mit der Listenkomprehension eine Notation für Listen, die an die Mengenkomprehension der Mathematik angelehnt ist Beispiel für Mengenkomprehension: in Haskell: {(x, y) x {1,..., 10}, y {x,..., 10}, 2 x y} [ ( 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 Letzte Änderung: 14.11.2017 15:37 6