2012-01-29 1 views
2

Je suis nouveau à Haskell et je reçois un comportement ennuyeux lors du débogage.GHCi - Le point d'arrêt est ignoré lors de la deuxième exécution

  1. ajouter mon point de rupture à l'aide: briser
  2. Je lance principale
  3. Tout est ok
  4. type I: continuer à terminer l'exécution

Quand je ré-exécuter principale, le point d'arrêt ne frappe plus mais le point d'arrêt n'a pas été supprimé car: Quelqu'un sait ce qui se passe?

Je suis sous Ubuntu 11.10, 64 bits. Je vais tester sur un environnement différent demain.

Merci

+0

Il serait probablement utile si vous avez posté la version de GHCi utilisée. –

+2

Il est difficile de savoir sans voir le code, mais il semble probable que lors de la deuxième exécution de la main, le point d'arrêt n'est jamais atteint parce que le résultat est mis en cache en raison d'une évaluation paresseuse. C'était probablement un THUNK (une évaluation suspendue) la première fois, et la deuxième fois c'est déjà évalué. – danr

+0

@danr, vous avez raison, toutes les entrées sont constantes, comme vous l'avez dit, tout doit être mis en cache après la première exécution. Je peux recharger le module mais malheureusement il supprime également tous les points d'arrêt. Ecrivez la réponse et je l'accepterai. –

Répondre

2

Il est difficile de savoir sans voir le code, mais il semble probable que la deuxième manche du principal point d'arrêt est jamais atteint parce que le résultat est mis en cache en raison de l'évaluation paresseuse. C'était probablement un THUNK (une évaluation suspendue) la première fois, et la deuxième fois c'est déjà évalué.

0

Pour éviter les recalculs, les formulaires de demande constante sont remplacés par une indirection à leur redex.

Par exemple, l'extrait suivant du côté droit de 'papperlap' sera remplacé par un noeud d'indirection pointant sur '4'.

bla x = x + 1 
papperlap = bla 3 

Si vous définissez un point d'arrêt sur « bla » et demandez « papperlap », vous verrez deux fois que « bla » est appliqué une seule fois. Mais si vous demandez deux fois 'bla 3', nous arrêterons aussi deux fois:

*Main> :break bla 
Breakpoint 0 activated at meerbla.hs:1:1-13 
*Main> papperlap 
Stopped at meerbla.hs:1:1-13 
_result :: a = _ 
[meerbla.hs:1:1-13] *Main> :continue 
4 
*Main> papperlap 
4 
*Main> bla 3 
Stopped at meerbla.hs:1:1-13 
_result :: a = _ 
[meerbla.hs:1:1-13] *Main> :continue 
4 
*Main> bla 3 
Stopped at meerbla.hs:1:1-13 
_result :: a = _ 
[meerbla.hs:1:1-13] *Main> :continue 
4 
Questions connexes