www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

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

Logo - DracheHaskell-Forum

JohnnyBGoode

Gepostet:
13.05.2011 21:24

Suche nach Möglichkeiten den Wert einer Variable während der Berechnung anzuzeigen  
Bei imperativen Programmiersprachen ist es möglich, sich den Wert einer Variable zu einem bestimmten Schritt der Auswertung ausgeben zu lassen.

x * (komplizierte_Funktion x y)
print x -- Wenn ich das Programm ablaufen lasse, sehe ich welchen Wert x in diesem Auswertungsschritt hat
x* (weiterrechnen_mit_x)

Bei fremden Programmen ist das sehr nützlich um herauszufinden, auch um schnell heruaszubekommen für was die Variable eigentlich steht...

Gibt es eine Möglichkeit, sowas auch bei Haskell (und anderen funktionalen Programmiersprachen) zu verwirklichen?
Zum Seitenanfang    
 
Landei

Gepostet:
14.05.2011 13:47

   
Wahrscheinlich ist das cleverste, den Umgang mit einem Debugger zu lernen. Natürlich lässt sich auch immer eine Art Meldung mitschleifen, etwa in deinem scanr2-Beispiel:


scanr2 step zero [] = ([zero],[\"Base case\"])
scanr2 step zero (x:xs) = ((step x (head p)):p, (\"x =\" ++ show x ++ \" xs=\" ++ show xs) : snd prev)
where prev = scanr2 step zero xs
p = fst prev


Aber das verändert natürlich massiv die Struktur deines Codes. Etwas bequemer, aber immer noch nicht Syntax-neutral, ist die Verwendung von Monaden, z.B. Writer: http://learnyouahaskell.com/for-a-few-monads-more#writer

Dann bliebe noch die Möglichkeit, an einer bestimmten Stelle und entsprechenden Bedingungen bewußt einen Error auszulösen, und in der Meldung die interessanten Werte zu übergeben. In deinem scanr2 Beispiel wollen wir z.B. die Werte sehen, wenn xs nur noch 2 Elemente hat:


scanr2 step zero [] = [zero]
scanr2 step zero (x:xs) = (step x (head prev)):prev
where prev | length xs == 2 = error $ \"x = \" ++ show x ++ \" xs = \" ++ show xs
| otherwise = scanr2 step zero xs
Zum Seitenanfang