Programmieren in Haskell - Algebraische Datentypen

Werbung
Programmieren
in Haskell
Stefan
Janssen
Programmieren in Haskell
Algebraische Datentypen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Stefan Janssen
Universität Bielefeld
AG Praktische Informatik
October 29, 2014
Abstraktion
Typsynonyme
Programmieren
in Haskell
1
2
3
1
Neue Typnamen durch Typsynonyme:
type Pair a b = (a , b )
type Triple a b c = (a ,b , c )
type OrdList a = [ a ]
definiert neue Namen, genannt Typ-Synonyme, für bereits
existieeremde Typen; hier im Beispiel für existierende
Tupel-Typen und Listen. Dient ausschliesslich der
Dokumentation.
newtype MyList a = [ a ]
führt ebenfalls einen NEUEN Typnamen analog zu [a] ein, der
aber nicht als typgleich betrachtet wird. Verhindert
gegenseitige Verwechslung von [a] und MyList a.
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Algebraische Datentypen
Programmieren
in Haskell
Neue Datentypen werden als algebraische Datentypen
eingeführt.
Stefan
Janssen
Typ-Synonyme
Werte des Datentyps sind Formeln, die aus Konstruktoren
zusammengesetzt sind
Konstruktoren sind Funktionen, die man deklarieren, aber
nicht definieren muss.
Konstruktornamen fangen mit Großbuchstaben an.
Algebraische Datentypen können polymorph sein und
Typ-Parameter haben.
Meistens sind sie rekursiv - ein Wert kann einen Teil-Wert
des gleichen Typs enthalten.
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Beispiel
Programmieren
in Haskell
1
2
data Bool = True |
False
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Beispiel
Programmieren
in Haskell
1
2
data Bool = True |
False
keine Typ-Parameter, nicht rekursiv, nur zwei Werte
Konstruktoren sind True und False
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Beispiel
Programmieren
in Haskell
1
2
data Bool = True |
False
keine Typ-Parameter, nicht rekursiv, nur zwei Werte
Konstruktoren sind True und False
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
→ beide null-stellig (nullary (data) constructor)
Funktionen nutzen pattern matching auf den
Konstruktoren, z.B. der Operator &&:
1
2
False && y = False
True && y = y
Abstraktion
Apropos Konstruktor
Programmieren
in Haskell
Stefan
Janssen
„Konstruktor“ meint immer (Daten-)Konstruktor.
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Apropos Konstruktor
Programmieren
in Haskell
Stefan
Janssen
1
„Konstruktor“ meint immer (Daten-)Konstruktor.
Einen Typnamen mit Parametern nennt man gelegentlich
„Typ-Konstruktor“
data T a b = ...
Typ-Konstruktor T “konstruiert” aus Typen a und b den Typ
T a b
Wir vermeiden die Bezeichnung “Typ-Konstruktor”.
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Beispiel
1
2
3
data Einheit
= Celsius
|
Fahrenheit |
Kelvin
Neuer Typ mit genau drei Werten.
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Beispiel
1
2
3
1
data Einheit
= Celsius
|
Fahrenheit |
Kelvin
Neuer Typ mit genau drei Werten.
data Temperatur = Temp Float Einheit
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Beispiel
1
2
3
1
data Einheit
= Celsius
|
Fahrenheit |
Kelvin
Neuer Typ mit genau drei Werten.
data Temperatur = Temp Float Einheit
(Einziger) Konstruktor Temp hat zwei Argumente, deren
Typen deklariert werden.
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Beispiel
1
2
3
1
data Einheit
= Celsius
|
Fahrenheit |
Kelvin
Neuer Typ mit genau drei Werten.
data Temperatur = Temp Float Einheit
(Einziger) Konstruktor Temp hat zwei Argumente, deren
Typen deklariert werden.
1
2
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
data Temp = Temp Float Einheit -- erlaubt und
-- ueblich !
Beispiel
1
2
3
1
data Einheit
= Celsius
|
Fahrenheit |
Kelvin
Neuer Typ mit genau drei Werten.
data Temperatur = Temp Float Einheit
(Einziger) Konstruktor Temp hat zwei Argumente, deren
Typen deklariert werden.
1
2
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
data Temp = Temp Float Einheit -- erlaubt und
-- ueblich !
→ Typkonstruktoren und (Daten-)Konstruktoren haben
getrennte Namensräume
Beispiel
Programmieren
in Haskell
1
Temp 506 Kelvin
:: Temperatur
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Beispiel
Programmieren
in Haskell
1
Temp 506 Kelvin
:: Temperatur
Stefan
Janssen
Typ-Synonyme
Algebraische
1
2
celsius2kelvin
celsius2kelvin t
Datentypen
:: Float -> Temperatur
Leftovers
= Temp ( t + 273.15) Kelvin
Musik
3
4
5
6
kel vin2fahrenheit
:: Float -> Temperatur
kel vin2fahrenheit t =
Temp ( t *9/5 -459.67) Fahrenheit
Das Beispiel ist inkonsequent, weil das Argument selbst nicht
vom Typ Temperatur ist.
Abstraktion
Beispiel
Programmieren
in Haskell
Stefan
Janssen
1
2
3
4
5
6
7
8
Temperatur-Umrechnung:
conv :: Temperatur -> Einheit -> Temperatur
conv ( Temp t Celsius ) Celsius
=
Temp t Celsius
conv ( Temp t Celsius ) Kelvin
=
Temp ( t + 273.15) Kelvin
conv ( Temp t Kelvin ) Fahrenheit =
Temp ( t *9/5 -459.67) Fahrenheit
...
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Algebraische Datentypen
Programmieren
in Haskell
Stefan
Janssen
Allgemeine Form der Deklaration:
data T a1 . . . am = C1 t11 . . . t1n1
...
Cr tr 1 . . . trnr
|
|
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Algebraische Datentypen
Programmieren
in Haskell
Stefan
Janssen
Allgemeine Form der Deklaration:
data T a1 . . . am = C1 t11 . . . t1n1
...
Cr tr 1 . . . trnr
|
|
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
T Typkonstruktor
Ci (Daten-)Konstruktoren
ai Typvariablen
tij Typen oder Typvariablen
Beispiel: Listen
Programmieren
in Haskell
1
2
Wenn man Listen noch einführen müßte ...
data List a = Cons a ( List a ) |
Nil
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Beispiel: Listen
Programmieren
in Haskell
1
2
Wenn man Listen noch einführen müßte ...
data List a = Cons a ( List a ) |
Nil
polymorhper Typ (Typ-Parameter a)
→ Algebraischer Datentyp List ist rekursiv definiert
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Beispiel: Listen
Programmieren
in Haskell
1
2
Wenn man Listen noch einführen müßte ...
data List a = Cons a ( List a ) |
Nil
polymorhper Typ (Typ-Parameter a)
→ Algebraischer Datentyp List ist rekursiv definiert
eingebaute Listentyp erlaubt syntaktischen Zucker:
: — „Cons“als Infix-Operator
[] — „Nil“
[] — Typ-Konstruktor, etwa in [Int]
Spezielle Listen-Notationen
Auf selbstgemachten Datentypen bekommen wir keine so
schöne Notation.
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Daten als Bäume dergestellt
Example
[1..5] = [1,2,3,4,5] = 1:2:3:4:5:[]
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Daten als Bäume dergestellt
Programmieren
in Haskell
Example
[1..5] = [1,2,3,4,5] = 1:2:3:4:5:[]
Typ-Synonyme
Cons
Algebraische
Datentypen
Leftovers
Cons
1
Stefan
Janssen
Musik
Abstraktion
2
Cons
3
Cons
4 Cons
5 Nil
Daten als Bäume dergestellt
Programmieren
in Haskell
Example
Stefan
Janssen
[1..5] = [1,2,3,4,5] = 1:2:3:4:5:[]
Algebraische
Datentypen
1
Cons
1
Typ-Synonyme
:
Cons
Leftovers
:
Musik
2
2
Cons
3
Cons
4 Cons
5 Nil
Abstraktion
:
3
:
4
:
5 []
Typ Maybe – hilft aus einer Verlegenheit
1
2
data Maybe a = Just a |
Nothing
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Typ Maybe – hilft aus einer Verlegenheit
1
2
data Maybe a = Just a |
Nothing
Konstruktor Just ist ein-stellig
Typvariable a als Parameter
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Typ Maybe – hilft aus einer Verlegenheit
1
2
data Maybe a = Just a |
Nothing
Konstruktor Just ist ein-stellig
Typvariable a als Parameter
Eine Form der Fehlerbehandlung bzw. Vorbeugung, wenn
eine Funktion ein Ergebnis liefert, das nicht in jedem Fall
existiert
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Typ Maybe – hilft aus einer Verlegenheit
1
2
data Maybe a = Just a |
Nothing
Konstruktor Just ist ein-stellig
Typvariable a als Parameter
Eine Form der Fehlerbehandlung bzw. Vorbeugung, wenn
eine Funktion ein Ergebnis liefert, das nicht in jedem Fall
existiert
1
2
3
> divide a b =
>
if b == 0 then error " divide by zero "
>
else div a b
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Typ Maybe – hilft aus einer Verlegenheit
1
2
data Maybe a = Just a |
Nothing
Konstruktor Just ist ein-stellig
Typvariable a als Parameter
Eine Form der Fehlerbehandlung bzw. Vorbeugung, wenn
eine Funktion ein Ergebnis liefert, das nicht in jedem Fall
existiert
1
2
3
1
2
3
> divide a b =
>
if b == 0 then error " divide by zero "
>
else div a b
Mit Maybe:
> divide a b
>
| b == 0
= Nothing
>
| otherwise
= Just ( div a b )
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Beispiel: Maybe
Programmieren
in Haskell
Stefan
Janssen
1
Typ von divide:
divide :: ( Num a ) = > a -> a -> Maybe a
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Beispiel: Maybe
Programmieren
in Haskell
Stefan
Janssen
1
1
2
3
4
Typ von divide:
divide :: ( Num a ) = > a -> a -> Maybe a
Pattern matching:
f a b = extract ( divide a b ) + ...
where
extract ( Just x ) = x
extract Nothing
= 0
Was ist der Typ von extract?
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Derived instance declarations
Programmieren
in Haskell
Optionale deriving Form:
data T a1 . . . am = C1 t11 . . . t1n1
...
Cr tr 1 . . . trnr
deriving (k1 , . . . , ku )
|
|
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Derived instance declarations
Programmieren
in Haskell
Optionale deriving Form:
data T a1 . . . am = C1 t11 . . . t1n1
...
|
|
Cr tr 1 . . . trnr
deriving (k1 , . . . , ku )
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
kx Typklassen
für bestimmte Klassen können Instanzen automatisch
erzeugt werden
das heißt, alle Operationen der Klassen werden auf dem
neuen Typ T automatisch implementiert.
Derived instance declarations
Programmieren
in Haskell
Optionale deriving Form:
data T a1 . . . am = C1 t11 . . . t1n1
...
|
|
Cr tr 1 . . . trnr
deriving (k1 , . . . , ku )
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
kx Typklassen
für bestimmte Klassen können Instanzen automatisch
erzeugt werden
das heißt, alle Operationen der Klassen werden auf dem
neuen Typ T automatisch implementiert.
→ einfacher als explizite Definition, die auch möglich ist
... deriving ...
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Example
1
2
3
Algebraische
Datentypen
data Maybe a = Nothing |
Leftovers
Just a
Musik
deriving ( Eq , Ord , Read , Show
)
Abstraktion
Damit sind Operationen wie == oder < auf dem Typ Maybe
implementiert.
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Und jetzt mal selber eine interessanten algebraischen Datentyp
definieren!!
Leftovers
Musik
Abstraktion
Konstruktoren mit benannten Feldern
Nachtrag (der Vollständigkeit halber):
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
1
2
1
2
3
Konstruktoren können mit Namen (field names) für ihre
Algebraische
Datentypen
Argumente deklariert werden
Leftovers
.. das kennt man aus anderen Sprachen als “records”
Musik
Beispiel: Punkte im Koordinatensystem
Abstraktion
Neben der bisherigen Typ Definition wie z.B.
> data Point = Pt Float Float |
Pol Float Float String deriving ( Show
gibt es auch die Form
> data Point = Pt { pointx , pointy :: Float } |
>
Pol { angle , stretch :: Float ,
>
color :: String } deriving ( Show , Eq )
Verwendung der Konstruktoren
Programmieren
in Haskell
1
2
3
4
Mit oder ohne Verwendung der Feldnamen
> p1 = Pt { pointx =1 , pointy =2}
> p2 = Pt { pointy =2 , pointx =1}
> p3 = Pol 45 1
> p30 = Pol { angle =45 , stretch =1}
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
5
Abstraktion
6
7
> p4 = Pt { pointx =0 , pointy =1}
> p5 = Pol { angle =90 , stretch =1 , color = " yellow " }
Bei verwendung der Namen:
Die Klammern sind notwendig
die Reihenfolge ist beliebig
Nutzen der Feldnamen
Programmieren
in Haskell
Feldnamen vorwiegend gebraucht bei Konstruktoren mit sehr
vielen Argumenten
Anordnung ist egal: Pt 1 2 =
Pt{pointy=2, pointx=1}
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Feldnamen dienen als vordefinierte Selektoren
Musik
mirror p = Pt {pointx= pointy p, pointy = pointx p}
gleichnamige Feldnamen unter verschiedenen
Konstruktoren sind erlaubt ... mit gleichem Typ
Nicht alle Felder müssen definiert werden:
p30 = Pol{angle=45, stretch=1}
lässt Feld color undefiniert – im Unterschied zu
p3 = Pol 45 1
Abstraktion
Subtiler Unterschied –was geht hier vor?
Main> p30
Pol {angle = 45.0, stretch = 1.0, color = "
Program error: undefined field: Pol
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Main> p3
ERROR - Cannot find "show" function for:
*** Expression : p3
*** Of type
: String -> Point
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Main> p3 "red"
Pol {angle = 45.0, stretch = 1.0, color = "red"}
Main> p30 "red"
ERROR - Type error
*** Expression
*** Term
*** Type
*** Does not match
in application
: p30 "red"
: p30
: Point
: a -> b
Modellierung von Musik
Programmieren
in Haskell
cis
dis
fis
gis
ais
cis
dis
fis
gis
ais
des
es
ges
as
b
des
es
ges
as
b
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
c
d
e
f
g
a
h
c
d
e
f
Quelle: http://commons.wikimedia.org/wiki/File:Klaviatur.svg, Public Domain
g
a
h
Modellierung von Musik
1
2
> module Musik where
> import R a t i o
Programmieren
in Haskell
Stefan
Janssen
3
4
5
> infixr 7 :∗:
> i n f i x r 6 :+:
Typ-Synonyme
6
7
8
> type G a n z e Z a h l
> type Bruch
= Int
= Ratio Int
> type Ton
> type Dauer
= GanzeZahl
= Bruch
Algebraische
Datentypen
Leftovers
9
10
11
Musik
Abstraktion
12
13
14
15
16
17
18
19
20
> data Musik
=
>
Note
Ton
Dauer
>
Pause Dauer
>
Musik
:∗:
Musik
>
Musik
:+:
Musik
>
Instr
I n s t r u m e n t Musik
>
Tempo G a n z e Z a h l
Musik
>
deriving
|
|
|
|
|
−− h i n t e r e i n a n d e r
−− g l e i c h z e i t i g
−− S c h l a e g e p r o Minute
Show
Modellierung von Musik
Programmieren
in Haskell
Stefan
Janssen
22
23
24
147
148
149
150
151
> data Instrument =
>
A co usticGrand Pi an o
|
>
B ri ghtAcousti cP i a no |
...
>
TelephoneRing
|
>
Helicopter
|
>
Applause
|
>
Gunshot
>
deriving ( Show , Enum )
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Modellierung von Musik
Programmieren
in Haskell
Stefan
Janssen
Sieben Ganztöne: c d e f g a h
c
Halbtöne über den Tönen:
cis dis eis (= f) fis gis ais his (=c)
Typ-Synonyme
Halbtöne unter den Tönen:
ces (=h) des es fes (=e) ges as b
Leftovers
Algebraische
Datentypen
Musik
cis
dis
fis
gis
ais
cis
dis
fis
gis
ais
des
es
ges
as
b
des
es
ges
as
b
d
e
f
g
a
h
c
d
e
f
g
a
Abstraktion
h
Modellierung von Musik
19
> module M u s i k H e l p e r where
Programmieren
in Haskell
20
21
Stefan
Janssen
> import Musik
22
Typ-Synonyme
23
24
25
> ce , c i s , des , de , d i s , es , eh , e i s , f e s
> e f , f i s , ges , ge , g i s , as , ah , a i s , be , ha , h i s
cis
dis
fis
gis
ais
cis
dis
fis
gis
ais
des
es
ges
as
b
des
es
ges
as
b
: : TonAlgebraische
: : TonDatentypen
Leftovers
Musik
Abstraktion
c
d
e
f
g
a
h
c
d
e
f
g
a
h
Modellierung von Musik
19
> module M u s i k H e l p e r where
Programmieren
in Haskell
20
21
Stefan
Janssen
> import Musik
22
Typ-Synonyme
23
24
25
> ce , c i s , des , de , d i s , es , eh , e i s , f e s
> e f , f i s , ges , ge , g i s , as , ah , a i s , be , ha , h i s
Leftovers
26
27
28
29
30
31
32
33
: : TonAlgebraische
: : TonDatentypen
>
>
>
>
>
>
>
ce
de
eh
ef
ge
ah
ha
=
=
=
=
=
=
=
0
2
4
5
7
9
11
;
;
;
;
;
;
;
cis
dis
eis
fis
gis
ais
his
=
=
=
=
=
=
=
1
3
5
6
8
10
12
;
;
;
;
;
;
des
es
fes
ges
as
be
=
=
=
=
=
=
1
3
4
6
8
10
Musik
Abstraktion
Formeln, die Musik bedeuten
1
2
3
Note
0 (1/4)
Note 24 (1/1)
Pause
(1/16)
-- Viertelnote tiefes C
-- ganze Note
c’
-- Sechzehntelpause
4
5
6
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Note 24 (1/4) :*: Note 26 (1/4) :*: Note 28 (1/4)
Leftovers
-- Anfang der C - Dur Tonleiter
(c
Musik
7
Abstraktion
8
9
Note 24 (1/4) :+: Note 28 (1/4) :+: Note 31 (1/4)
-- C - Dur Akkord (c ,e , g )
10
11
12
13
14
Tempo
Tempo
Instr
Instr
70 m
180 m
Oboe m
VoiceAahs m
-----
Musik
Musik
Musik
Musik
m
m
m
m
als Adagio
als Presto
von Oboe gespielt
gesummt
Abkürzungen
35
> gP , hP , vP , aP , sP :: Musik
36
37
38
39
40
41
>
>
>
>
>
gP
hP
vP
aP
sP
=
=
=
=
=
Pause
Pause
Pause
Pause
Pause
(1/1)
(1/2)
(1/4)
(1/8)
(1/16)
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Abkürzungen
35
> gP , hP , vP , aP , sP :: Musik
36
37
38
39
40
41
43
>
>
>
>
>
gP
hP
vP
aP
sP
=
=
=
=
=
Pause
Pause
Pause
Pause
Pause
(1/1)
(1/2)
(1/4)
(1/8)
(1/16)
46
47
48
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
> adagio , andante , allegro , presto :: GanzeZahl
44
45
Programmieren
in Haskell
>
>
>
>
adagio = 70
andante = 90
allegro = 140
presto = 180
Abkürzungen
Programmieren
in Haskell
Stefan
Janssen
50
> c’ , d’ , e’ , f ’ , g’ , a’ , h’ , c’ ’
51
52
53
54
55
56
57
58
59
>
>
>
>
>
>
>
>
c’
d’
e’
f’
g’
a’
h’
c’’
u
u
u
u
u
u
u
u
=
=
=
=
=
=
=
=
Note
Note
Note
Note
Note
Note
Note
Note
( c e +24)
( de +24)
( eh +24)
( e f +24)
( ge +24)
( ah +24)
( ha +24)
( c e +36)
u
u
u
u
u
u
u
u
: : Dauer −> Musik
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Zusammengesetzte Klänge
Programmieren
in Haskell
61
> c DurTon i ka : : Musik
Stefan
Janssen
62
63
> c DurTon i ka = c ’ ( 1 / 1 ) : + : e ’ ( 1 / 1 ) : + : g ’ ( 1 / 1 )
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Zusammengesetzte Klänge
Programmieren
in Haskell
61
> c DurTon i ka : : Musik
Stefan
Janssen
62
63
> c DurTon i ka = c ’ ( 1 / 1 ) : + : e ’ ( 1 / 1 ) : + : g ’ ( 1 / 1 )
64
65
66
67
68
> cDurSkala
>
c ’ (3/8)
>
>
= Tempo a l l e g r o (
: ∗ : d ’ (1/8) : ∗ : e ’ (3/8) : ∗ : f ’ (4/8)
: ∗ : g ’ (1/8) : ∗ : a ’ (1/4) : ∗ : h ’ (1/8)
: ∗ : c ’ ’ (1/2))
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Zusammengesetzte Klänge
Programmieren
in Haskell
61
> c DurTon i ka : : Musik
Stefan
Janssen
62
63
> c DurTon i ka = c ’ ( 1 / 1 ) : + : e ’ ( 1 / 1 ) : + : g ’ ( 1 / 1 )
64
65
66
67
68
70
71
> cDurSkala
>
c ’ (3/8)
>
>
= Tempo a l l e g r o (
: ∗ : d ’ (1/8) : ∗ : e ’ (3/8) : ∗ : f ’ (4/8)
: ∗ : g ’ (1/8) : ∗ : a ’ (1/4) : ∗ : h ’ (1/8)
: ∗ : c ’ ’ (1/2))
> durDreiklang t
>
= Note t ( 1 / 1 ) : + : Note ( t +4) ( 1 / 1 )
: + : Note ( t +7) ( 1 / 1 )
72
73
74
> m o l l D r e i k l a n g t = Note t ( 1 / 1 ) : + : Note ( t +3) ( 1 / 1 )
>
: + : Note ( t +7) ( 1 / 1 )
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Transponierung
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
79
> transponiere
: : Ton −> Musik −> Musik
Algebraische
Datentypen
80
81
82
83
84
85
86
>
>
>
>
>
>
t r a n s p o n i e r e i ( Pause d )
=
t r a n s p o n i e r e i ( Note t d ) =
t r a n s p o n i e r e i (m1 : ∗ : m2) =
:∗:
t r a n s p o n i e r e i (m1 : + : m2) =
:+:
Pause d
Note ( t+i ) d
( transponiere
( transponiere
( transponiere
( transponiere
Leftovers
i
i
i
i
m1)
m2)
m1)
m2)
Musik
Abstraktion
Verschiedenes
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
92
93
> wdh
: : Musik −> Musik
> wdh m = m : ∗ : m
Leftovers
94
95
96
> ad_infinitum
: : Musik −> Musik
> ad_infinitum m = m : ∗ : ad_infinitum m
97
98
Algebraische
Datentypen
> einsatz
d m = ( Pause d ) : ∗ : m
Musik
Abstraktion
Bruder Jakob: Text
Programmieren
in Haskell
Bruder Jakob, Bruder Jakob
Schläfst du noch? Schläfst du noch?
||: Hörst du nicht die Glocken? :||
Ding dang dong, ding dang dong.
Stefan
Janssen
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Quelle: http://de.wikipedia.org/w/index.php?title=Datei:
FrereJacques1pt.png&filetimestamp=20070819210216, Public Domain
Bruder Jakob: Bauelemente
100
101
102
103
104
105
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
>
>
>
>
>
>
phrase1 = c ’ (1/4) : ∗ :
phrase2 = e ’ (1/4) : ∗ :
phrase3 = g ’ (1/8) : ∗ :
: ∗ : e ’ (1/4)
phrase4 = c ’ (1/4) : ∗ :
s t r o p h e = wdh p h r a s e 1
d ’ ( 1 / 4 ) : ∗ : e ’ ( 1 / 4 ) : ∗ : c ’ ( 1Algebraische
/4)
Datentypen
f ’ (1/4) : ∗ : g ’ (1/2)
Leftovers
a ’ (1/8) : ∗ : g ’ (1/8) : ∗ : f ’ (1/8)
Musik
: ∗ : c ’ (1/4)
( t r a n s p o n i e r e ( −12) ( g ’ ( 1 / 4 ) ) )Abstraktion
:∗: c ’
: ∗ : wdh p h r a s e 2 : ∗ : wdh p h r a s e 3 : ∗ : wdh
Bruder Jakob: Der ganze Kanon
107
Programmieren
in Haskell
Stefan
Janssen
endlos = ad_infinitum strophe
108
−− h i e r bekommen w i r S c h w i e r i g k
−− wenn w i r d a s i n MIDI Typ-Synonyme
umwande
Algebraische
Datentypen
109
110
> endlos = strophe : ∗ : strophe
Leftovers
111
112
113
114
115
116
> b r u d e r J a k o b = Tempo a n d a n t e
>
( e i n s a t z (0/1)
:+:
>
( e i n s a t z (2/1)
>
( e i n s a t z (4/1)
:+:
>
( e i n s a t z (6/1)
( I n s t r ChoirAahs
endlos
Musik
Abstraktion
( t r a n s p o n i e r e 12 e n d l o s ) ) : + :
endlos )
endlos )))
Bruder Jakob: Variante
118
Programmieren
in Haskell
Stefan
Janssen
Typ-Synonyme
Eine Variante
Algebraische
Datentypen
119
120
121
122
123
124
> bruderJakob2
>
:+:
>
>
:+:
>
= Tempo a l l e g r o ( I n s t r A c o u s t i c G r a n d P i a n o
Leftovers
( e i n s a t z (0/1) endlos
Musik
( e i n s a t z ( 2 / 1 ) ( t r a n s p o n i e r e 12 e n d l o s ) ) Abstraktion
:+:
( e i n s a t z (4/1) endlos )
( e i n s a t z (6/1) endlos ) ) )
Abstraktion ...
130
131
Programmieren
in Haskell
> tritonus_f_1
> tritonus t d
= Note e f ( 1 / 1 ) : + : Note ha ( 1 / 1 )
= Note t d
: + : Note ( t +6) d
132
133
134
Stefan
Janssen
Typ-Synonyme
> tritonus_f_1
> tritonus
: : Musik
: : Ton −> Dauer −> Musik
Algebraische
Datentypen
Leftovers
Musik
Abstraktion – das ist hier der Übergang von einer Formel, die
einen Musikstück beschreibt, zu einer Funktion, die abhängig
von ihren Parametern ein Musikstück konstruiert.
Sie erlaubt es uns, in unserer Formelsprache für Musik auch
harmonische Gesetze zu definieren. In der klassischen
Notenschrift geht das nicht.
Abstraktion
Musik
Programmieren
in Haskell
Stefan
Janssen
Wir verwenden bisher das Haskore-System.
Der Nachfolger von Haskore ist Euterpea:
http://haskell.cs.yale.edu/?page_id=103
Paul Hudak. The Haskell School of Music. 2.0 edition,
2011.
http:
//www.cs.yale.edu/homes/hudak/Papers/HSoM.pdf
Typ-Synonyme
Algebraische
Datentypen
Leftovers
Musik
Abstraktion
Herunterladen