Funktionale Programmierung in Haskell

Unendliche Strukturen

Robert Steuck (inf8948)
Philipp Pribbernow (inf8949)

Unendliche Strukturen

Definition

Vorteile

Lazy Evaluation

Unendliche Listen

Definition

Folgen und Mengen

Folge der natürlichen Zahlen

Fibbonacci-Folge

Mengendarstellung

Anwendungen

Listen als Grenzwerte

Ordnungen über Approximationen

Für alle Zahlen, Booleans, Character und Aufzählungstypen jeglicher Art gilt:

Für Listen gilt:

Beispiel:

Erweiterung der Approximationsordnung

Eigenschaften unendlicher Listen

Beweis

Zyklische Strukturen

Definition

Beispiele

Unedliche Liste mit rekursiver definition:

Antworten files/zyklisch.hs
answers :: [Int]
answers = 42 : answers
 
Auswertung files/zyklisch.hs
answers = 42 : answers
answers = 42 : 42 : answers
answers = 42 : 42 : 42 : answers
...
 

Funktioniert auch mit Strings:

Unendlicher String files/zyklisch.hs
tooMuch :: String
tooMuch = "You know " ++ muchMore
                 where muchMore = "too much, " ++ muchMore
 

Alternative Erzeugung durch repeat

Definition files/zyklisch.hs
repeat x :: a -> [a]
repeat x = x : reapeat x
 
answers = repeat 42
 
repeat 42 
 {- wird ersetzte durch -} 
42 : repeat 42
Bessere Definition files/zyklisch.hs
repeat x :: a -> [a]
repeat x = xs
           where
             xs = x : xs
 

Effizienzvorteil zyklischer Strukturen

Verbesserung von Iterate files/zyklisch.hs
iterate  :: (a -> a) -> a -> [a]
 
{- Definition ohne map O(n) -}
iterate f x = x : iterate f (f x)
 
{- Definition mit map O(n²) -}
iterate f x = x : map f (iterate f x)
 
{- zyklische Definition O(n) -}
iterate f x = xs
              where
                xs = x : map f xs

Unendliche Bäume

Definition

Erzeugung

Beispiel Tic Tac Toe

Bewertungsfunktion

Abbildung zwischen Bäumen

Auswertungsstrategien

Fazit

Modularisierung

Streams

Streams als unendliche Listen

Signatur von interact
interact :: (String -> String) -> IO ()
Abgespeckte Version von cat files/mycat.hs
main :: IO ()
main = interact id

Weitere shell-Kommandos