70 votes

Quel est le meilleur moyen de tester et d’interagir avec les fonctions internes définies dans une fonction de niveau supérieur?

Lorsque je programme en Javascript, je trouve extrêmement pratique de pouvoir utiliser le débogueur pour interrompre l'exécution du programme à tout moment, d'exécuter des commandes et d'inspecter des variables à partir de là.

De retour à Haskell, existe-t-il un moyen d'exécuter des fonctions arbitraires dans la REPL interactive GHCI ou suis-je limité aux choses déclarées au plus haut niveau?

Quelle est l'approche "standard" du travail et du débogage des fonctions et valeurs internes?

85voto

hammar Points 89293

Lorsque vous êtes arrêté à un point d'arrêt dans GHCi, vous pouvez accéder à tout ce qui est dans la portée. Disons que vous avez une fonction comme ceci:

foo :: Int -> Int
foo x = g (x + 2)
  where g y = x^y 

Vous pouvez définir un point d'arrêt sur l' foo et essayez de l'appeler:

> :break foo
Breakpoint 1 activated at /tmp/Foo.hs:(2,1)-(3,17)
> foo 42
Stopped at /tmp/Foo.hs:(2,1)-(3,17)
_result :: Int = _

g n'est pas à la portée encore à ce stade, nous avons donc à l'étape une fois:

[/tmp/Foo.hs:(2,1)-(3,17)] > :step
Stopped at /tmp/Foo.hs:2:9-17
_result :: Int = _
g :: Integral b => b -> Int = _
x :: Int = 42

Maintenant que g est dans la portée, nous pouvons l'utiliser comme n'importe quel niveau supérieur de la fonction:

[/tmp/Foo.hs:2:9-17] > g 2
1764
[/tmp/Foo.hs:2:9-17] > g 3
74088

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X