www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

Xan

Gepostet:
27.07.2012 22:31

was macht diese unfold_fanction  
Hallo,
ich brauch wieder Hilfe .
Ich weiß nicht was diese Funktion macht...
[/code]
unfold :: (t -> Bool) -> (t -> a) -> (t -> t) -> t -> [a]
unfold p h t x | p x = []
| otherwise = h x : unfold p h t (t x)

[/code][/code]
Zum Seitenanfang    
 
Landei

Gepostet:
28.07.2012 19:53

   
Eine Fold-Funktion (foldl, foldr u.s.w.) macht aus einer Liste einen einzelnen Wert, eine Unfold-Funktion macht das Gegenteil, es macht aus einem Start-Wert (hier t) eine Liste [a].

Wie würden wir in einer imperativen Sprache wie Java so eine Liste aufbauen?


List<A> list = new ArrayList<A>();
for(T loopVar = x; ! p(loopVar); loopVar = h(loopVar)) {
list.add(t(loopVar));
}


Genau das tut auch unfoldr. Das vierte Argument x :: t ist der Startwert. Das erste Argument p :: (t -> Bool) ist das Abbruchkriterium, es ist der Basisfall der Rekursion, und liefert eine leere Liste. Das dritte Argument h :: (t -> t) ist die Schritt-Funktion, die den Wert der Schleifenvariable für den nächsten Durchlauf festlegt. Nun wäre es wenig flexibel, wenn man immer nur die Schleifenvariable in der Ergebnisliste speichern würde, also gibt es noch als zweites Argument t :: (t -> a) eine Transformations-Funktion.

Ein Anwendungsbeispiel: Wir wollen die Quadrate aller ungeraden Zahlen n von 1 <= n < 20 als Liste erhalten. Was ist der Startwert? Natürlich n = 1. Das Abbruchkriterium ist n >= 20. Die Transformations-Funktion ist das Quadrieren. Die Schritt-Funktion ist n\\\' = n + 2 (da wir nur die ungeraden Zahlen wollen):


unfold (>= 20) (^2) (+2) 1
-- [1,9,25,49,81,121,169,225,289,361]


Data.List.unfoldr funktioniert genauso, verwendet aber nur eine, dafür kompliziertere Funktion: unfoldr :: (b -> Maybe (a, b)) -> b -> [a], wobei das Maybe die Rolle der Prädikatsfunktion übernimmt (kommt Nothing, ist Schluss), und das Ergebnis sowohl den Wert für den nächsten Schritt als auch den Wert für die Liste enthält.
Zum Seitenanfang