2015-09-06 1 views
1

Je suis novice en programmation fonctionnelle et j'aimerais déboguer une fonction récursive pour voir pourquoi j'obtiens une valeur particulière en tant que valeur de retour. Comment puis-je accomplir cela? J'ai trouvé quelques réponses sur ce site aussi bien qu'en ligne, mais je ne peux pas m'empêcher de penser à faire ça. Toute aide serait appréciée.Débogage Haskell

recur = \a -> if a>100 then a-10 else recur (recur (a+11)) 
+0

Vous ne pouvez vraiment pas déboguer en Haskell dans le sens traditionnel du terme, parce que Haskell, étant une langue purement fonctionnelle, ne change pas d'état pendant l'exécution. Cela dit, je trace généralement à travers des algorithmes récursifs sur papier. – Tetramputechture

+0

J'ai essayé de le tracer sur du papier mais il en résulte une boucle infinie. Mais quand j'exécute la fonction en haskell, ça renvoie le résultat. Donc, il doit y avoir un point où Haskell arrête d'évaluer l'argument que je passe et je ne sais pas lequel. – user30646

+3

@Tetramputechture Pas vraiment. Il y a ['Debug.Trace'] (https://hackage.haskell.org/package/base-4.8.1.0/docs/Debug-Trace.html), et il y a aussi les commandes de débogage dans GHCi. Cela dit, les algorithmes de traçage sur papier sont en effet une très bonne suggestion. – duplode

Répondre

6

Vous pouvez le faire (en utilisant Debug.Trace):

import Debug.Trace (trace) 

recur a | trace ("recur " ++ show a) False = undefined 
recur a = if a>100 then a-10 else recur (recur (a+11)) 

Ce produit sortie chaque fois que la fonction recur est appelée (ou plutôt, parce que Haskell est paresseux, chaque fois que le résultat de l'application recur est nécessaire).

Exemple de sortie (en ghci):

*Main> recur 99 
recur 99 
recur 110 
recur 100 
recur 111 
recur 101 
91 
+1

Astuce soignée avec la garde. – duplode

+1

@duplode Je l'ai volé sur http://okmij.org/ftp/Haskell/#making-function-strict. – melpomene