debugging - swirl - ¿Cuál es la mejor manera de probar e interactuar con las funciones internas definidas dentro de una función de nivel superior?
operador_binario<- function(fun, a, b){ (1)
Cuando programo en Javascript, me parece 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 GHCI REPL interactivo o estoy limitado a cosas declaradas en el toplevel?
¿Cuál es el enfoque "estándar" para trabajar y depurar funciones y valores internos?
Cuando te detienen en un punto de interrupción en GHCi, puedes acceder a todo lo que esté dentro del alcance. Digamos que tienes una función como esta:
foo :: Int -> Int
foo x = g (x + 2)
where g y = x^y
Puede 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
aún 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á dentro del alcance, 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