¿Cuál es la mejor manera de probar e interactuar con funciones internas definidas dentro de una función de nivel superior?


Cuando programo en Javascript, encuentro extremadamente conveniente poder usar el depurador para detener la ejecución del programa en cualquier punto y poder ejecutar comandos e inspeccionar variables desde allí.

Ahora, de vuelta en Haskell, ¿hay alguna manera de ejecutar funciones arbitrarias en el GHCI interactivo REPL o estoy limitado a cosas declaradas en el nivel superior?

¿Cuál es el enfoque "estándar" para trabajar y depurar funciones y valores internos?

Author: hugomg, 2012-04-03

1 answers

Cuando se detiene en un punto de interrupción en GHCi, puede acceder a cualquier cosa que esté en el alcance. Digamos que tienes una función como esta:

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

Puedes establecer un punto de interrupción en foo e intentar llamarlo:

> :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 todavía no está en el alcance en este punto, así que tenemos que dar un paso una vez:

[/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

Ahora que g está en el ámbito, podemos usarlo como cualquier función de nivel superior:

[/tmp/Foo.hs:2:9-17] > g 2
1764
[/tmp/Foo.hs:2:9-17] > g 3
74088
 85
Author: hammar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-03 06:11:23