home Funktionale Programmierung: Typsynonyme und isomorphe Typen Prof. Dr. Uwe Schmidt FH Wedel

Typsynonyme und isomorphe Typen

weiter

weiter

Typsynonyme

Literatur
 
weiter
Aliasnamen
für Datentypen
weiter
Beispiel
color   :: (Float, Float) -> (Int, Int, Int)
weiter
schlecht
in den Typen keine Bescheibung des Anwendungsgebiets
weiter
Lösung: Typsynonyme
Beispiel
 
type Point      = (Float, Float)
type Color      = Int
type RGB        = (Color, Color, Color)
 
color   :: Point -> RGB
weiter
Namenskonvention
Aliasnamen für Typen beginnen mit einem Großbuchstaben
weiter
Semantik
Die Semantik eines Programms wird nicht durch die Verwendung der Typsynonyme verändert.
weiter
merke
Alle Vorkommen von Typsynonymen können durch wiederholtes Ersetzen eliminiert werden.
weiter
merke
Keine Rekursion in type Definitionen.
weiter
String Datentyp
für Zeichenreihen auch nur ein Typsynonym
 
type String     = [Char]
weiter
merke
String ist nur eine Ausprägung von Listen
weiter
String Literale
nur eine abkürzende Schreibweise
 
"abc"   = ['a', 'b', 'c']
"a"     = ['a']
""      = []
weiter
merke
Listen: Extra Kapitel
weiter

weiter

Neue isomorphe Typen

Problem
Für Typsynonyme sind keine neuen instance Deklarationen möglich
weiter
Beispiel
type Cartesian  = (Float, Float)   -- komplexe Zahlen
type Polar      = (Float, Float)
 
type Angle      = Float            -- Bogenmaß
 
2 unterschiedliche Darstellungen für komplexe Zahlen
weiter
merke
Operationen unterschiedlich: +, -, *, /, ==, /=, ... bei Cartesian und Polar
 
bei Angle: ==, /=, ... anders als in Float realisiert
weiter
Lösung
data Angle      = MkAngle Float
 
instance Eq Angle where
  MkAngle x == MkAngle y   = normalize x == normalize y
 
normalize       :: Float -> Float
normalize x
   | x < 0      = normalize (x + rot)
   | x >= rot   = normalize (x - rot)
   | otherwise  = x
   where
   rot = 2 * pi
weiter
merke
Alle Werte werden mit dem Konstrukor MkAngle "eingewickelt"
weiter
schlecht
Laufzeiteffizienz: "Einwickeln" und "Auswickeln" kosten Platz und Zeit
weiter
schlecht
Neuer Wert
 
MkAngle
weiter
schlecht
Angle ist nicht isomorph zu Float
weiter
Lösung
newtype Angle   = MkAngle Float
weiter
merke
Der Konstruktor MkAngle ist strikt
 
MkAngle =
weiter
gut
Angle und Float sind isomorph
weiter
gut
Laufzeiteffizienz: "Einwickeln" und "Auswickeln" kann im Compiler eliminiert werden,
also entsteht keine Laufzeitverschlechterung.
weiter
gut
Für mit newtype deklarierte Typen sind wie für data neuen instance Deklarationen möglich.
weiter
merke
Ein sehr teurer Fehler durch Mischen von Größen unterschiedlicher physikalischer Einheiten:
Mars Climate Orbiter disaster

Letzte Änderung: 29.09.2019
© Prof. Dr. Uwe Schmidt
Prof. Dr. Uwe Schmidt FH Wedel