Preview only show first 10 pages with watermark. For full document please download

Die Programmiersprache Clean Und Uniqueness Typing

   EMBED


Share

Transcript

Die Programmiersprache Clean und Uniqueness Typing Julian Biendarra Fortgeschrittene Konzepte der funktionalen Programmierung Sommersemester 2015 TU München 27. Mai 2015 Abbildung: http://xkcd.com/1312 Clean Abbildung: http://xkcd.com/1312 Gliederung 1 Hello World! 2 Clean 3 Syntax-Vergleich Haskell ↔ Clean 4 Uniqueness Typing Referenzielle Transparenz Einführung Theorie 5 Uniqueness Typing in Clean Attribute und Variablen Propagation Curried Funktionsanwendung 6 I/O in Clean Beispiel Hash Lets Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 3 / 26 Gliederung 1 Hello World! 2 Clean 3 Syntax-Vergleich Haskell ↔ Clean 4 Uniqueness Typing Referenzielle Transparenz Einführung Theorie 5 Uniqueness Typing in Clean Attribute und Variablen Propagation Curried Funktionsanwendung 6 I/O in Clean Beispiel Hash Lets Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 4 / 26 Hello World! Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 5 / 26 Hello World! Hello World in Haskell module Main where Hello World in Clean module helloworld main :: IO () main = putStr "Hello World!\n" Start :: String Start = "Hello World!\n" Hello World with Clean I/O module helloworldlong import StdEnv Start :: ∗ World -> ∗ World Start filesys0 | closeok = filesys2 | otherwise = abort "I/O Error" where (console, filesys1) = stdio filesys0 console1 = fwrites ("Hello World!\n") console (closeok, filesys2) = fclose console1 filesys1 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 5 / 26 Hello World! Hello World in Haskell module Main where Hello World in Clean module helloworld main :: IO () main = putStr "Hello World!\n" Start :: String Start = "Hello World!\n" Hello World with Clean I/O module helloworldlong import StdEnv Start :: ∗ World -> ∗ World Start filesys0 | closeok = filesys2 | otherwise = abort "I/O Error" where (console, filesys1) = stdio filesys0 console1 = fwrites ("Hello World!\n") console (closeok, filesys2) = fclose console1 filesys1 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 5 / 26 Hello World! Hello World in Haskell module Main where Hello World in Clean module helloworld main :: IO () main = putStr "Hello World!\n" Start :: String Start = "Hello World!\n" Hello World with Clean I/O module helloworldlong import StdEnv Start :: ∗ World -> ∗ World Start filesys0 | closeok = filesys2 | otherwise = abort "I/O Error" where (console, filesys1) = stdio filesys0 console1 = fwrites ("Hello World!\n") console (closeok, filesys2) = fclose console1 filesys1 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 5 / 26 Gliederung 1 Hello World! 2 Clean 3 Syntax-Vergleich Haskell ↔ Clean 4 Uniqueness Typing Referenzielle Transparenz Einführung Theorie 5 Uniqueness Typing in Clean Attribute und Variablen Propagation Curried Funktionsanwendung 6 I/O in Clean Beispiel Hash Lets Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 6 / 26 Clean http://clean.cs.ru.nl/Clean rein funktionale Programmiersprache entwickelt 1984 an der University of Nijmegen basiert auf Manipulation von Graphen (sog. Term Graph Rewriting Systems) Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 7 / 26 Gliederung 1 Hello World! 2 Clean 3 Syntax-Vergleich Haskell ↔ Clean 4 Uniqueness Typing Referenzielle Transparenz Einführung Theorie 5 Uniqueness Typing in Clean Attribute und Variablen Propagation Curried Funktionsanwendung 6 I/O in Clean Beispiel Hash Lets Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 8 / 26 Syntax-Vergleich Haskell ↔ Clean Fibonacci-Zahlen fib fib fib fib :: Int -> Int 0 = 0 1 = 1 n = fib (n − 1) + fib (n − 2) Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 9 / 26 Syntax-Vergleich Haskell ↔ Clean Fibonacci-Zahlen Haskell/Clean fib :: Int -> Int fib 0 = 0 fib 1 = 1 fib n = fib (n − 1) + fib (n − 2) Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 9 / 26 Syntax-Vergleich Haskell ↔ Clean Mehrere Funktionsparameter Haskell add :: Int -> Int -> Int add a b = a + b Clean add :: Int Int -> Int add a b = a + b Typklassen Haskell max :: (Ord a) => a -> a -> a Clean max :: a a -> a | Ord a Haskell sum :: (Num a) => [a] -> a sum [] = 0 sum (x:xs) = x + sum xs Julian Biendarra Clean sum :: [a] -> a | +, zero a sum [] = zero sum [x:xs] = x + sum xs Clean & Uniqueness Typing 27. Mai 2015 10 / 26 Syntax-Vergleich Haskell ↔ Clean Mehrere Funktionsparameter Haskell add :: Int -> Int -> Int add a b = a + b Clean add :: Int Int -> Int add a b = a + b Typklassen Haskell max :: (Ord a) => a -> a -> a Clean max :: a a -> a | Ord a Haskell sum :: (Num a) => [a] -> a sum [] = 0 sum (x:xs) = x + sum xs Julian Biendarra Clean sum :: [a] -> a | +, zero a sum [] = zero sum [x:xs] = x + sum xs Clean & Uniqueness Typing 27. Mai 2015 10 / 26 Syntax-Vergleich Haskell ↔ Clean Mehrere Funktionsparameter Haskell add :: Int -> Int -> Int add a b = a + b Clean add :: Int Int -> Int add a b = a + b Typklassen Haskell max :: (Ord a) => a -> a -> a Clean max :: a a -> a | Ord a Haskell sum :: (Num a) => [a] -> a sum [] = 0 sum (x:xs) = x + sum xs Julian Biendarra Clean sum :: [a] -> a | +, zero a sum [] = zero sum [x:xs] = x + sum xs Clean & Uniqueness Typing 27. Mai 2015 10 / 26 Gliederung 1 Hello World! 2 Clean 3 Syntax-Vergleich Haskell ↔ Clean 4 Uniqueness Typing Referenzielle Transparenz Einführung Theorie 5 Uniqueness Typing in Clean Attribute und Variablen Propagation Curried Funktionsanwendung 6 I/O in Clean Beispiel Hash Lets Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 11 / 26 Referenzielle Transparenz engl. referential transparency Der gleiche Ausdruck muss bei jeder Auswertung das gleiche Ergebnis haben. Funktion inc int inc(int n) { return n + 1; } Beispiel inc(3) > 4 inc2(3) > 4 int one = 1; one = 2 inc(3) > 4 inc2(3) > 5 int inc2(int n) { return n + one; } Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 12 / 26 Referenzielle Transparenz engl. referential transparency Der gleiche Ausdruck muss bei jeder Auswertung das gleiche Ergebnis haben. Funktion inc int inc(int n) { return n + 1; } Beispiel inc(3) > 4 inc2(3) > 4 int one = 1; one = 2 inc(3) > 4 inc2(3) > 5 int inc2(int n) { return n + one; } Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 12 / 26 Referenzielle Transparenz engl. referential transparency Der gleiche Ausdruck muss bei jeder Auswertung das gleiche Ergebnis haben. Funktion inc int inc(int n) { return n + 1; } Beispiel inc(3) > 4 inc2(3) > 4 int one = 1; one = 2 inc(3) > 4 inc2(3) > 5 int inc2(int n) { return n + one; } Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 12 / 26 Uniqueness Typing Referenzielle Transparenz erfüllt? int fget2c(FILE∗ file) { int a = fgetc(file); int b = fgetc(file); return a + b; } zu schützende Variablen werden als unique bezeichnet unique Variablen dürfen max. 1 Referenz auf sich haben Referenzielle Transparenz erfüllt? fget2c :: ∗ File -> (Int, ∗ File) fget2c file0 = let (a, file1) = fgetc file0 (b, file2) = fgetc file1 in (a + b, file2) Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 13 / 26 Uniqueness Typing Referenzielle Transparenz erfüllt? Nein! int fget2c(FILE∗ file) { int a = fgetc(file); int b = fgetc(file); return a + b; } zu schützende Variablen werden als unique bezeichnet unique Variablen dürfen max. 1 Referenz auf sich haben Referenzielle Transparenz erfüllt? fget2c :: ∗ File -> (Int, ∗ File) fget2c file0 = let (a, file1) = fgetc file0 (b, file2) = fgetc file1 in (a + b, file2) Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 13 / 26 Uniqueness Typing Referenzielle Transparenz erfüllt? Nein! int fget2c(FILE∗ file) { int a = fgetc(file); int b = fgetc(file); return a + b; } zu schützende Variablen werden als unique bezeichnet unique Variablen dürfen max. 1 Referenz auf sich haben Referenzielle Transparenz erfüllt? fget2c :: ∗ File -> (Int, ∗ File) fget2c file0 = let (a, file1) = fgetc file0 (b, file2) = fgetc file1 in (a + b, file2) Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 13 / 26 Uniqueness Typing Referenzielle Transparenz erfüllt? Nein! int fget2c(FILE∗ file) { int a = fgetc(file); int b = fgetc(file); return a + b; } zu schützende Variablen werden als unique bezeichnet unique Variablen dürfen max. 1 Referenz auf sich haben Referenzielle Transparenz erfüllt? fget2c :: ∗ File -> (Int, ∗ File) fget2c file0 = let (a, file1) = fgetc file0 (b, file2) = fgetc file1 in (a + b, file2) Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 13 / 26 Uniqueness Typing Referenzielle Transparenz erfüllt? Nein! int fget2c(FILE∗ file) { int a = fgetc(file); int b = fgetc(file); return a + b; } zu schützende Variablen werden als unique bezeichnet unique Variablen dürfen max. 1 Referenz auf sich haben Referenzielle Transparenz erfüllt? Ja! fget2c :: ∗ File -> (Int, ∗ File) fget2c file0 = let (a, file1) = fgetc file0 (b, file2) = fgetc file1 in (a + b, file2) Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 13 / 26 Uniqueness Typing Referenzielle Transparenz erfüllt? Nein! int fget2c(FILE∗ file) { int a = fgetc(file); int b = fgetc(file); return a + b; } zu schützende Variablen werden als unique bezeichnet unique Variablen dürfen max. 1 Referenz auf sich haben fget2c :: ∗ File -> (Int, ∗ File) fget2c file0 = let (a, file1) = fgetc file0 (b, file2) = fgetc file0 in (a + b, file2) Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 13 / 26 Uniqueness Typing Referenzielle Transparenz erfüllt? Nein! int fget2c(FILE∗ file) { int a = fgetc(file); int b = fgetc(file); return a + b; } zu schützende Variablen werden als unique bezeichnet unique Variablen dürfen max. 1 Referenz auf sich haben Uniqueness von file0 verletzt! fget2c :: ∗ File -> (Int, ∗ File) fget2c file0 = let (a, file1) = fgetc file0 (b, file2) = fgetc file0 in (a + b, file2) Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 13 / 26 Uniqueness als Attribut Uniqueness als Attribut des Typs einer Variable: Notation non-unique unique vereinfacht [11] type× type• Clean type ∗ type Uniqueness-Variable typeu u:type Uniqueness-Bedingung [w ≤ u] [w <= u] Beispiel × w const :: t u −→ s v −→ t u [w ≤ u] Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 14 / 26 Uniqueness als Attribut Uniqueness als Attribut des Typs einer Variable: Notation non-unique unique vereinfacht [11] type× type• Clean type ∗ type Uniqueness-Variable typeu u:type Uniqueness-Bedingung [w ≤ u] [w <= u] Beispiel × w const :: t u −→ s v −→ t u [w ≤ u] Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 14 / 26 Uniqueness als Attribut Uniqueness als Attribut des Typs einer Variable: Notation non-unique unique vereinfacht [11] type× type• Clean type ∗ type Uniqueness-Variable typeu u:type Uniqueness-Bedingung [w ≤ u] [w <= u] Beispiel × w const :: t u −→ s v −→ t u [w ≤ u] Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 14 / 26 Uniqueness als Attribut Uniqueness als Attribut des Typs einer Variable: Notation non-unique unique vereinfacht [11] type× type• Clean type ∗ type Uniqueness-Variable typeu u:type Uniqueness-Bedingung [w ≤ u] [w <= u] Beispiel × w const :: t u −→ s v −→ t u [w ≤ u] Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 14 / 26 Uniqueness als Attribut Uniqueness als Attribut des Typs einer Variable: Notation non-unique unique vereinfacht [11] type× type• Clean type ∗ type Uniqueness-Variable typeu u:type Uniqueness-Bedingung [w ≤ u] [w <= u] Beispiel × w const :: t u −→ s v −→ t u [w ≤ u] Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 14 / 26 Uniqueness-Attribut als Typ Idee: • und × sind Typen wie Int Char Problem: Was ist ein Wert vom Typ •? Lösung: Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 15 / 26 Uniqueness-Attribut als Typ Idee: • und × sind Typen wie Int Char Problem: Was ist ein Wert vom Typ •? Lösung: Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 15 / 26 Uniqueness-Attribut als Typ Idee: • und × sind Typen wie Int Char Problem: Was ist ein Wert vom Typ •? Lösung: Kinds sind die „Typen der Typen“ ∗ konkreter Typ T Typ ohne Uniqueness-Attribut U Uniqueness-Attribut: • oder × Attr :: T -> U -> ∗ Julian Biendarra konstruiert konkrete Typen Clean & Uniqueness Typing 27. Mai 2015 15 / 26 Uniqueness-Attribut als Typ Idee: • und × sind Typen wie Int Char Problem: Was ist ein Wert vom Typ •? Lösung: Kinds sind die „Typen der Typen“ ∗ konkreter Typ T Typ ohne Uniqueness-Attribut U Uniqueness-Attribut: • oder × Attr :: T -> U -> ∗ Julian Biendarra konstruiert konkrete Typen Clean & Uniqueness Typing 27. Mai 2015 15 / 26 Uniqueness-Attribut als Typ Idee: • und × sind Typen wie Int Char Problem: Was ist ein Wert vom Typ •? Lösung: Kinds sind die „Typen der Typen“ ∗ konkreter Typ T Typ ohne Uniqueness-Attribut U Uniqueness-Attribut: • oder × Attr :: T -> U -> ∗ Julian Biendarra konstruiert konkrete Typen Clean & Uniqueness Typing 27. Mai 2015 15 / 26 Uniqueness-Attribut als Typ Idee: • und × sind Typen wie Int Char Problem: Was ist ein Wert vom Typ •? Lösung: Kinds sind die „Typen der Typen“ ∗ konkreter Typ T Typ ohne Uniqueness-Attribut U Uniqueness-Attribut: • oder × Attr :: T -> U -> ∗ Julian Biendarra konstruiert konkrete Typen Clean & Uniqueness Typing 27. Mai 2015 15 / 26 Uniqueness-Attribut als Typ Idee: • und × sind Typen wie Int Char Problem: Was ist ein Wert vom Typ •? Lösung: Kinds sind die „Typen der Typen“ ∗ konkreter Typ T Typ ohne Uniqueness-Attribut U Uniqueness-Attribut: • oder × Attr :: T -> U -> ∗ Julian Biendarra konstruiert konkrete Typen Clean & Uniqueness Typing 27. Mai 2015 15 / 26 Uniqueness-Attribut als Typ Idee: • und × sind Typen wie Int Char Problem: Was ist ein Wert vom Typ •? Lösung: Kinds sind die „Typen der Typen“ ∗ konkreter Typ T Typ ohne Uniqueness-Attribut U Uniqueness-Attribut: • oder × Attr :: T -> U -> ∗ Julian Biendarra konstruiert konkrete Typen Clean & Uniqueness Typing 27. Mai 2015 15 / 26 Gliederung 1 Hello World! 2 Clean 3 Syntax-Vergleich Haskell ↔ Clean 4 Uniqueness Typing Referenzielle Transparenz Einführung Theorie 5 Uniqueness Typing in Clean Attribute und Variablen Propagation Curried Funktionsanwendung 6 I/O in Clean Beispiel Hash Lets Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 16 / 26 Uniqueness-Attribute und -Variablen Notation non-unique unique necessarily unique vereinfacht [11] type× type• – Clean type ∗ type ∗ type Uniqueness-Variable anonyme Uniqueness-Variable typeu – u:type .type Uniqueness-Bedingung [w ≤ u] [w <= u] Beispiel const :: u:t -> w:(v:s -> u:t), [w <= u] Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 17 / 26 Uniqueness-Attribute und -Variablen Notation non-unique unique necessarily unique vereinfacht [11] type× type• – Clean type ∗ type ∗ type Uniqueness-Variable anonyme Uniqueness-Variable typeu – u:type .type Uniqueness-Bedingung [w ≤ u] [w <= u] Beispiel const :: u:t -> w:(v:s -> u:t), [w <= u] Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 17 / 26 Uniqueness-Attribute und -Variablen Notation non-unique unique necessarily unique vereinfacht [11] type× type• – Clean type ∗ type ∗ type Uniqueness-Variable anonyme Uniqueness-Variable typeu – u:type .type Uniqueness-Bedingung [w ≤ u] [w <= u] Beispiel const :: u:t -> w:(v:s -> u:t), [w <= u] Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 17 / 26 Uniqueness-Attribute und -Variablen Notation non-unique unique necessarily unique vereinfacht [11] type× type• – Clean type ∗ type ∗ type Uniqueness-Variable anonyme Uniqueness-Variable typeu – u:type .type Uniqueness-Bedingung [w ≤ u] [w <= u] Beispiel const :: u:t -> w:(v:s -> u:t), [w <= u] Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 17 / 26 Uniqueness-Attribute und -Variablen Notation non-unique unique necessarily unique vereinfacht [11] type× type• – Clean type ∗ type ∗ type Uniqueness-Variable anonyme Uniqueness-Variable typeu – u:type .type Uniqueness-Bedingung [w ≤ u] [w <= u] Beispiel const :: u:t -> w:(v:s -> u:t), [w <= u] Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 17 / 26 Uniqueness-Attribute und -Variablen Notation non-unique unique necessarily unique vereinfacht [11] type× type• – Clean type ∗ type ∗ type Uniqueness-Variable anonyme Uniqueness-Variable typeu – u:type .type Uniqueness-Bedingung [w ≤ u] [w <= u] Beispiel const :: u:t -> w:(v:s -> u:t), [w <= u] Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 17 / 26 Uniqueness-Attribute und -Variablen Notation non-unique unique necessarily unique vereinfacht [11] type× type• – Clean type ∗ type ∗ type Uniqueness-Variable anonyme Uniqueness-Variable typeu – u:type .type Uniqueness-Bedingung [w ≤ u] [w <= u] Beispiel const :: u:t -> w:(v:s -> u:t), [w <= u] Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 17 / 26 Uniqueness Propagation head head :: [∗ a] -> ∗ a head [x:xs] = x heads heads :: [∗ a] -> (∗ a, ∗ a) heads list = (head list, head list) Uniqueness von a verletzt a unique ⇒ [a] unique Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 18 / 26 Uniqueness Propagation head head :: [∗ a] -> ∗ a head [x:xs] = x heads heads :: [∗ a] -> (∗ a, ∗ a) heads list = (head list, head list) Uniqueness von a verletzt a unique ⇒ [a] unique Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 18 / 26 Uniqueness Propagation head head :: [∗ a] -> ∗ a head [x:xs] = x heads heads :: [∗ a] -> (∗ a, ∗ a) heads list = (head list, head list) Uniqueness von a verletzt a unique ⇒ [a] unique Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 18 / 26 Uniqueness Propagation head head :: [∗ a] -> ∗ a head [x:xs] = x heads heads :: [∗ a] -> (∗ a, ∗ a) heads list = (head list, head list) Uniqueness von a verletzt a unique ⇒ [a] unique Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 18 / 26 Uniqueness Propagation head head :: ∗ [∗ a] -> head [x:xs] = x ∗ a heads heads :: [∗ a] -> (∗ a, ∗ a) heads list = (head list, head list) Uniqueness von a verletzt a unique ⇒ [a] unique Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 18 / 26 Uniqueness bei curried Anwendung von Funktionen fwritec fwritec :: Char ∗ File -> ∗ File writeParallel writeParallel :: (Char -> ∗ File) -> (∗ File, writeParallel f = (f 'a', f 'b') ∗ File) Beispiel somefile :: ∗ Julian Biendarra File Clean & Uniqueness Typing 27. Mai 2015 19 / 26 Uniqueness bei curried Anwendung von Funktionen fwritec fwritec :: Char ∗ File -> ∗ File writeParallel writeParallel :: (Char -> ∗ File) -> (∗ File, writeParallel f = (f 'a', f 'b') ∗ File) Beispiel somefile :: ∗ Julian Biendarra File Clean & Uniqueness Typing 27. Mai 2015 19 / 26 Uniqueness bei curried Anwendung von Funktionen fwritec fwritec :: ∗ File Char -> ∗ File writeParallel writeParallel :: (Char -> ∗ File) -> (∗ File, writeParallel f = (f 'a', f 'b') ∗ File) Beispiel somefile :: ∗ Julian Biendarra File Clean & Uniqueness Typing 27. Mai 2015 19 / 26 Uniqueness bei curried Anwendung von Funktionen fwritec fwritec :: ∗ File Char -> ∗ File writeParallel writeParallel :: (Char -> ∗ File) -> (∗ File, writeParallel f = (f 'a', f 'b') ∗ File) Beispiel fwritec somefile :: u:(Char -> Julian Biendarra ∗ File) Clean & Uniqueness Typing 27. Mai 2015 19 / 26 Uniqueness bei curried Anwendung von Funktionen fwritec fwritec :: ∗ File Char -> ∗ File writeParallel writeParallel :: (Char -> ∗ File) -> (∗ File, writeParallel f = (f 'a', f 'b') ∗ File) Beispiel fwritec somefile :: Char -> Julian Biendarra ∗ File Clean & Uniqueness Typing 27. Mai 2015 19 / 26 Uniqueness bei curried Anwendung von Funktionen fwritec fwritec :: ∗ File Char -> ∗ File writeParallel writeParallel :: (Char -> ∗ File) -> (∗ File, writeParallel f = (f 'a', f 'b') ∗ File) Beispiel fwritec somefile :: Char -> Julian Biendarra ∗ File Clean & Uniqueness Typing 27. Mai 2015 19 / 26 Uniqueness bei curried Anwendung von Funktionen fwritec fwritec :: ∗ File Char -> ∗ File writeParallel writeParallel :: (Char -> ∗ File) -> (∗ File, writeParallel f = (f 'a', f 'b') ∗ File) Beispiel writeParallel (fwritec somefile) :: (∗ File, Julian Biendarra Clean & Uniqueness Typing ∗ File) 27. Mai 2015 19 / 26 Uniqueness bei curried Anwendung von Funktionen fwritec fwritec :: ∗ File Char -> ∗ File writeParallel writeParallel :: (Char -> ∗ File) -> (∗ File, writeParallel f = (f 'a', f 'b') ∗ File) Beispiel (fwritec somefile 'a', fwritec somefile 'b') Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 19 / 26 Uniqueness bei curried Anwendung von Funktionen fwritec fwritec :: ∗ File Char -> ∗ File writeParallel writeParallel :: (Char -> ∗ File) -> (∗ File, writeParallel f = (f 'a', f 'b') ∗ File) Beispiel (fwritec somefile 'a', fwritec somefile 'b') Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 19 / 26 Uniqueness bei curried Anwendung von Funktionen fwritec fwritec :: ∗ File Char -> ∗ File writeParallel writeParallel :: (Char -> ∗ File) -> (∗ File, writeParallel f = (f 'a', f 'b') ∗ File) Beispiel fwritec somefile :: u:(Char -> Julian Biendarra ∗ File) Clean & Uniqueness Typing 27. Mai 2015 19 / 26 Uniqueness bei curried Anwendung von Funktionen fwritec fwritec :: ∗ File -> ∗ (Char -> ∗ File) writeParallel writeParallel :: (Char -> ∗ File) -> (∗ File, writeParallel f = (f 'a', f 'b') ∗ File) Beispiel fwritec somefile :: u:(Char -> Julian Biendarra ∗ File) Clean & Uniqueness Typing 27. Mai 2015 19 / 26 Gliederung 1 Hello World! 2 Clean 3 Syntax-Vergleich Haskell ↔ Clean 4 Uniqueness Typing Referenzielle Transparenz Einführung Theorie 5 Uniqueness Typing in Clean Attribute und Variablen Propagation Curried Funktionsanwendung 6 I/O in Clean Beispiel Hash Lets Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 20 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf readCharList readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 | not readok = ([], file1) | otherwise = ([c : cs], file2) where (readok, c, file1) = freadc file0 (cs, file2) = readCharList file1 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf readCharList readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 | not readok = ([], file1) | otherwise = ([c : cs], file2) where (readok, c, file1) = freadc file0 (cs, file2) = readCharList file1 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf readCharList readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 | not readok = ([], file1) | otherwise = ([c : cs], file2) where (readok, c, file1) = freadc file0 (cs, file2) = readCharList file1 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf readCharList readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 | not readok = ([], file1) | otherwise = ([c : cs], file2) where (readok, c, file1) = freadc file0 (cs, file2) = readCharList file1 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf readCharList readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 | not readok = ([], file1) | otherwise = ([c : cs], file2) where (readok, c, file1) = freadc file0 (cs, file2) = readCharList file1 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf readCharList readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 | not readok = ([], file1) | otherwise = ([c : cs], file2) where (readok, c, file1) = freadc file0 (cs, file2) = readCharList file1 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf readCharList readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 | not readok = ([], file1) | otherwise = ([c : cs], file2) where (readok, c, file1) = freadc file0 (cs, file2) = readCharList file1 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf catFile catFile :: String ∗ env -> ∗ env | FileSystem env catFile filename filesys0 | readok && closeok0 && closeok1 = filesys4 | otherwise = abort "I/O Error" where (readok, file0, filesys1) = fopen filename FReadText filesys0 (charList, file1) = readCharList file0 (closeok0, filesys2) = fclose file1 filesys1 (console0, filesys3) = stdio filesys2 console1 = fwrites (toString charList) console0 (closeok1, filesys4) = fclose console1 filesys3 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf catFile catFile :: String ∗ env -> ∗ env | FileSystem env catFile filename filesys0 | readok && closeok0 && closeok1 = filesys4 | otherwise = abort "I/O Error" where (readok, file0, filesys1) = fopen filename FReadText filesys0 (charList, file1) = readCharList file0 (closeok0, filesys2) = fclose file1 filesys1 (console0, filesys3) = stdio filesys2 console1 = fwrites (toString charList) console0 (closeok1, filesys4) = fclose console1 filesys3 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf catFile catFile :: String ∗ env -> ∗ env | FileSystem env catFile filename filesys0 | readok && closeok0 && closeok1 = filesys4 | otherwise = abort "I/O Error" where (readok, file0, filesys1) = fopen filename FReadText filesys0 (charList, file1) = readCharList file0 (closeok0, filesys2) = fclose file1 filesys1 (console0, filesys3) = stdio filesys2 console1 = fwrites (toString charList) console0 (closeok1, filesys4) = fclose console1 filesys3 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf catFile catFile :: String ∗ env -> ∗ env | FileSystem env catFile filename filesys0 | readok && closeok0 && closeok1 = filesys4 | otherwise = abort "I/O Error" where (readok, file0, filesys1) = fopen filename FReadText filesys0 (charList, file1) = readCharList file0 (closeok0, filesys2) = fclose file1 filesys1 (console0, filesys3) = stdio filesys2 console1 = fwrites (toString charList) console0 (closeok1, filesys4) = fclose console1 filesys3 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf catFile catFile :: String ∗ env -> ∗ env | FileSystem env catFile filename filesys0 | readok && closeok0 && closeok1 = filesys4 | otherwise = abort "I/O Error" where (readok, file0, filesys1) = fopen filename FReadText filesys0 (charList, file1) = readCharList file0 (closeok0, filesys2) = fclose file1 filesys1 (console0, filesys3) = stdio filesys2 console1 = fwrites (toString charList) console0 (closeok1, filesys4) = fclose console1 filesys3 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf catFile catFile :: String ∗ env -> ∗ env | FileSystem env catFile filename filesys0 | readok && closeok0 && closeok1 = filesys4 | otherwise = abort "I/O Error" where (readok, file0, filesys1) = fopen filename FReadText filesys0 (charList, file1) = readCharList file0 (closeok0, filesys2) = fclose file1 filesys1 (console0, filesys3) = stdio filesys2 console1 = fwrites (toString charList) console0 (closeok1, filesys4) = fclose console1 filesys3 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf catFile catFile :: String ∗ env -> ∗ env | FileSystem env catFile filename filesys0 | readok && closeok0 && closeok1 = filesys4 | otherwise = abort "I/O Error" where (readok, file0, filesys1) = fopen filename FReadText filesys0 (charList, file1) = readCharList file0 (closeok0, filesys2) = fclose file1 filesys1 (console0, filesys3) = stdio filesys2 console1 = fwrites (toString charList) console0 (closeok1, filesys4) = fclose console1 filesys3 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf catFile catFile :: String ∗ env -> ∗ env | FileSystem env catFile filename filesys0 | readok && closeok0 && closeok1 = filesys4 | otherwise = abort "I/O Error" where (readok, file0, filesys1) = fopen filename FReadText filesys0 (charList, file1) = readCharList file0 (closeok0, filesys2) = fclose file1 filesys1 (console0, filesys3) = stdio filesys2 console1 = fwrites (toString charList) console0 (closeok1, filesys4) = fclose console1 filesys3 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf catFile catFile :: String ∗ env -> ∗ env | FileSystem env catFile filename filesys0 | readok && closeok0 && closeok1 = filesys4 | otherwise = abort "I/O Error" where (readok, file0, filesys1) = fopen filename FReadText filesys0 (charList, file1) = readCharList file0 (closeok0, filesys2) = fclose file1 filesys1 (console0, filesys3) = stdio filesys2 console1 = fwrites (toString charList) console0 (closeok1, filesys4) = fclose console1 filesys3 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf catFile catFile :: String ∗ env -> ∗ env | FileSystem env catFile filename filesys0 | readok && closeok0 && closeok1 = filesys4 | otherwise = abort "I/O Error" where (readok, file0, filesys1) = fopen filename FReadText filesys0 (charList, file1) = readCharList file0 (closeok0, filesys2) = fclose file1 filesys1 (console0, filesys3) = stdio filesys2 console1 = fwrites (toString charList) console0 (closeok1, filesys4) = fclose console1 filesys3 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 I/O Beispiel: cat in Clean readCharList liest Datei als Liste von Chars ein catFile schreibt Inhalt von Datei auf stdout Start ruft catFile auf Start Start :: ∗ World -> ∗ World Start world = catFile "test.txt" world Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 21 / 26 Hash Lets # x = x + 1 Syntactic Sugar für Definitionen mit where Scope: ab nächster Zeile über alle folgenden Hash Lets und Guards lesbarer Code (vergleichbar mit imperativen Programm) readCharList ohne Hash Lets readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 | not readok = ([], file1) | otherwise = ([c : cs], file2) where (readok, c, file1) = freadc file0 (cs, file2) = readCharList file1 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 22 / 26 Hash Lets # x = x + 1 Syntactic Sugar für Definitionen mit where Scope: ab nächster Zeile über alle folgenden Hash Lets und Guards lesbarer Code (vergleichbar mit imperativen Programm) readCharList ohne Hash Lets readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 | not readok = ([], file1) | otherwise = ([c : cs], file2) where (readok, c, file1) = freadc file0 (cs, file2) = readCharList file1 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 22 / 26 Hash Lets # x = x + 1 Syntactic Sugar für Definitionen mit where Scope: ab nächster Zeile über alle folgenden Hash Lets und Guards lesbarer Code (vergleichbar mit imperativen Programm) readCharList mit Hash Lets readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 # (readok, c, file) = freadc file | not readok = ([], file1) | otherwise = ([c : cs], file2) where (cs, file2) = readCharList file1 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 22 / 26 Hash Lets # x = x + 1 Syntactic Sugar für Definitionen mit where Scope: ab nächster Zeile über alle folgenden Hash Lets und Guards lesbarer Code (vergleichbar mit imperativen Programm) readCharList mit Hash Lets readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 # (readok, c, file) = freadc file | not readok = ([], file1) | otherwise = ([c : cs], file2) where (cs, file2) = readCharList file1 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 22 / 26 Hash Lets # x = x + 1 Syntactic Sugar für Definitionen mit where Scope: ab nächster Zeile über alle folgenden Hash Lets und Guards lesbarer Code (vergleichbar mit imperativen Programm) readCharList mit Hash Lets readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 # (readok, c, file) = freadc file | not readok = ([], file) | otherwise = ([c : cs], file2) where (cs, file2) = readCharList file1 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 22 / 26 Hash Lets # x = x + 1 Syntactic Sugar für Definitionen mit where Scope: ab nächster Zeile über alle folgenden Hash Lets und Guards lesbarer Code (vergleichbar mit imperativen Programm) readCharList mit Hash Lets readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 # (readok, c, file) = freadc file | not readok = ([], file) | otherwise = ([c : cs], file2) where (cs, file2) = readCharList file1 Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 22 / 26 Hash Lets # x = x + 1 Syntactic Sugar für Definitionen mit where Scope: ab nächster Zeile über alle folgenden Hash Lets und Guards lesbarer Code (vergleichbar mit imperativen Programm) readCharList mit Hash Lets readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 # (readok, c, file) = freadc file | not readok = ([], file) # (cs, file) = readCharList file | otherwise = ([c : cs], file2) Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 22 / 26 Hash Lets # x = x + 1 Syntactic Sugar für Definitionen mit where Scope: ab nächster Zeile über alle folgenden Hash Lets und Guards lesbarer Code (vergleichbar mit imperativen Programm) readCharList mit Hash Lets readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 # (readok, c, file) = freadc file | not readok = ([], file) # (cs, file) = readCharList file | otherwise = ([c : cs], file2) Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 22 / 26 Hash Lets # x = x + 1 Syntactic Sugar für Definitionen mit where Scope: ab nächster Zeile über alle folgenden Hash Lets und Guards lesbarer Code (vergleichbar mit imperativen Programm) readCharList mit Hash Lets readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 # (readok, c, file) = freadc file | not readok = ([], file) # (cs, file) = readCharList file | otherwise = ([c : cs], file) Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 22 / 26 Hash Lets # x = x + 1 Syntactic Sugar für Definitionen mit where Scope: ab nächster Zeile über alle folgenden Hash Lets und Guards lesbarer Code (vergleichbar mit imperativen Programm) readCharList mit Hash Lets readCharList :: ∗ File -> ([Char], ∗ File) readCharList file0 # (readok, c, file) = freadc file | not readok = ([], file) # (cs, file) = readCharList file | otherwise = ([c : cs], file) Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 22 / 26 Hash Lets # x = x + 1 Syntactic Sugar für Definitionen mit where Scope: ab nächster Zeile über alle folgenden Hash Lets und Guards lesbarer Code (vergleichbar mit imperativen Programm) readCharList mit Hash Lets readCharList :: ∗ File -> ([Char], ∗ File) readCharList file # (readok, c, file) = freadc file | not readok = ([], file) # (cs, file) = readCharList file | otherwise = ([c : cs], file) Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 22 / 26 Vielen Dank für eure Aufmerksamkeit! module fragen Start :: String Start = "Fragen?\n" Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 23 / 26 Quellen I Achten, Peter: Clean for Haskell98 Programmers – A Quick Reference Guide. http://www.mbsd.cs.ru.nl/publications/papers/2007/ achp2007-CleanHaskellQuickGuide.pdf, 2007. Abgerufen am 09.05.2015. Achten, Peter und Martin Wierich: A Tutorial to the Clean Object I/O Library – Version 1.2. http: //clean.cs.ru.nl/download/supported/ObjectIO.1.2/doc/tutorial.pdf, 2004. Abgerufen am 17.04.2015. Barendsen, Erik und Sjaak Smetsers: Conventional and uniqueness typing in graph rewrite systems. In: Shyamasundar, Rudrapatna K. (Herausgeber): Foundations of Software Technology and Theoretical Computer Science, Band 761 der Reihe Lecture Notes in Computer Science, Seiten 41–51. Springer Berlin Heidelberg, 1993. Barendsen, Erik und Sjaak Smetsers: Uniqueness typing for functional languages with graph rewriting semantics. Mathematical Structures in Computer Science, 6:579–612, 1996. Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 24 / 26 Quellen II Brus, Tom, Marko van Eekelen, Maarten van Leer und Rinus Plasmeijer: Clean – A language for functional graph rewriting. In: Kahn, Gilles (Herausgeber): Functional Programming Languages and Computer Architecture, Band 274 der Reihe Lecture Notes in Computer Science, Seiten 364–384. Springer Berlin Heidelberg, 1987. Eekelen, Marko van, Sjaak Smetsers und Rinus Plasmeijer: Graph rewriting semantics for functional programming languages. In: Dalen, Dirk van und Marc Bezem (Herausgeber): Computer Science Logic, Band 1258 der Reihe Lecture Notes in Computer Science, Seiten 106–128. Springer Berlin Heidelberg, 1997. Koopman, Pieter: Functional Programming in Clean – An Appetizer. http://www.inf.ufsc.br/~jbosco/tutorial.html. Abgerufen am 17.04.2015. Koopman, Pieter, Rinus Plasmeijer, Marko van Eekelen und Sjaak Smetsers: Functional Programming in Clean. http://www.mbsd.cs.ru.nl/papers/cleanbook/CleanBookI.pdf, 2002. Part 1. Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 25 / 26 Quellen III Plasmeijer, Rinus und Marko van Eekelen: Functional Programming and Parallel Graph Rewriting. Addison-Wesley, 1993. Plasmeijer, Rinus, Marko van Eekelen und John van Groningen: Clean language report – Version 2.2. http://clean.cs.ru.nl/download/doc/CleanLangRep.2.2.pdf, 2011. Abgerufen am 17.04.2015. Vries, Edsko de, Rinus Plasmeijer und David M. Abrahamson: Uniqueness Typing Simplified. In: Chitil, Olaf, Zoltán Horváth und Viktória Zsók (Herausgeber): Implementation and Application of Functional Languages, Band 5083 der Reihe Lecture Notes in Computer Science, Seiten 201–218. Springer Berlin Heidelberg, 2008. Julian Biendarra Clean & Uniqueness Typing 27. Mai 2015 26 / 26