Die Programmiersprache Clean und Uniqueness Typing

Transcrição

Die Programmiersprache Clean und Uniqueness Typing
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

Documentos relacionados