www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

Luks

Gepostet:
26.11.2009 19:14

induction redefiniert mit foldr  
hey ich hab mal wieder nen problem.
soll die funktion induction mit der funktion foldr redefinieren.
induction is definiert durch:


induction base comb n
| n== 0 = base
| n > 0 = comb n (induction base comb(n-1))


danke schonmal
Zum Seitenanfang    
 
Siracusa

Gepostet:
27.11.2009 04:14

   
Hallo,

mach dich mal vertraut damit, wie foldr arbeitet. Hier (http://book.realworldhaskell.org/read/functional-programming.html#fp.foldr.filter) gibt es ein Beispiel, das zeigt, dass foldr deiner induction schon sehr nahe kommt. Die Rekursion läuft bei foldr lediglich über eine Liste, nicht wie bei dir über die Zahlen von n bis 0.


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Skater203

Gepostet:
27.11.2009 23:35

   
Hey.. also ich komme auf diese Aufgabe auch gar nicht klar, wenn jemand ne Lösung hat, könnte er die ja mal posten ... auch wie ich mit foldr map filter und last definieren soll.. KA..

Geht mir voll auf Sack sowas.. wozu sollen wir das machen ... bähhh...
Zum Seitenanfang    
 
Luks

Gepostet:
29.11.2009 18:14

   
also für map is relativ simpel

map' :: (a -> b) -> [a] ->
map' f xs = foldr (\x acc -> f x : acc) [] xs


aber bei filter hab ich irgendwie nen fehler drin...

filter' :: (a -> Bool) -> [a] -> [a]
filter' p xs = foldr (\ x acc -> if p x == True then x:acc else acc) xs []


und last is wieder simpel (wenn man weiß wies geht:-) )

last' :: [a] -> a
last' xs = foldr1 (\_ x -> x) xs



tja, bei inductin habe ich den scheiß nicht hinbekomm, kotz
meine idee/ansatz:
induction' base comb n = foldr (\ x y -> x `comb` y) n [n .. 0]
Zum Seitenanfang    
 
Siracusa

Gepostet:
29.11.2009 20:11

   
Hallo,

es sind nur kleine Fehler. Bei filter' hast du hinten den Anfangs-Akkumulator und die Liste vertauscht, da müsste [] xs stehen. Und bei induction' sollte das erste n hinten der Startwert base sein. Außerdem funktioniert [n .. 0] nicht, Haskell zählt ab der ersten Zahl immer +1 aufwärts, es sei denn du gibst explizit an, wie die folgende Zahl ausehen soll: [n, n-1 .. 0]


Viele Grüße,

Siracusa
Zum Seitenanfang    
 
Luks

Gepostet:
30.11.2009 08:01

   
herzlichsten dank für die hilfe
Zum Seitenanfang