2009-03-23 3 views
31

He utilizado el depurador ghci pero realmente preferiría si estuviera un poco integrado con un editor de texto para simplificar el proceso de configuración de puntos de interrupción. Probablemente no debería evaluar estrictamente cada variable visible, pero al menos simplificar el proceso de mirar el estado local.¿Cuál es una buena manera de depurar el código haskell?

Recientemente encontré la función de rastreo que ha sido útil al permitir impresiones de depuración desde lugares que de otra manera serían difíciles.

+1

Probablemente ya lo haya leído, pero solo como referencia: http://www.haskell.org/haskellwiki/Debugging – sastanin

Respuesta

8

Sí, una interfaz para el depurador GHCi sería una buena cosa. Quizás podamos hacer algo durante el próximo Hackathon. Sin embargo, mientras tanto:

Alternativamente, Haskell se presta muy bien a las pruebas de abajo arriba usando QuickCheck. Es decir, pruebe sus componentes individualmente, luego júntelos. Si su código es puro, esto a menudo solo funciona.

+5

Pero a menudo, "ponerlos juntos" es donde se encuentra el problema. – RnMss

12

Una buena manera de depurar el código de Haskell es escribir y probar las leyes algebraicas usando QuickCheck y SmallCheck. Ha habido varios depuradores de Haskell, incluidos Hat, Hood y Freya, pero ninguno de ellos ha sido percibido como suficientemente valioso como para que valga la pena mantenerlo durante mucho tiempo.

Cuando es Haskell, tienes que pensar de manera diferente sobre cómo hacer las cosas. El documento de ICFP en la página QuickCheck tiene algunos buenos ejemplos para comenzar. Si desea un ejemplo en el mundo real, xmonad se depura ampliamente usando QuickCheck.

+1

El enlace de comprobación rápida está dando un error 403. (05 de octubre, 03:38:04 UTC) Si no se trata de un error transitorio, alguien puede publicar un nuevo enlace –

+0

Aquí hay un enlace de comprobación rápida actualizado; (www.cs -> www.cse): http://www.cse.chalmers.se/~rjmh/QuickCheck/ – SuperElectric

+26

¿Puedo señalar respetuosamente que existe una diferencia entre la depuración y las pruebas?La depuración es encontrar la causa de un error, mientras que las pruebas buscan la existencia de errores. – kristianp

5

Como nota al margen, tenga en cuenta que Debug.trace NO será su amigo al depurar programas multiproceso.

Las pruebas son el camino a seguir en el largo plazo.

3

Para mis propios fines, creo que es una combinación de factores.

  1. Escribir código funcional fácil de depurar, esto significa asegurarse de que sus funciones sean relativamente pequeñas (5-20 líneas) y que solo hagan una cosa claramente definida cada una.
  2. Use HUnit para definir los casos de prueba que mostrarán sus problemas.

Como se ve en otras respuestas, mucha gente ama QuickCheck. Me ha resultado difícil definir casos de prueba significativos de QuickCheck para, al menos, algunos de mis códigos, por lo que generalmente uso más las pruebas de unidades estándar. Dicho esto, hay una excelente introducción al uso de QuickCheck en Chapter 11 de Real World Haskell.

Si se encuentra usando tanto QuickCheck como HUnit, puede consultar test-framework.

Cuestiones relacionadas