2009-01-06 10 views

Respuesta

5

Algunas ideas:

  1. La opción de línea de comandos de depuración (que puede configurar con :set +d en Abrazos) es informativa, pero es muy detallada y no muestra las reducciones en la sintaxis de Haskell.

  2. Probar Hat - the Haskell Tracer. Lo probé en un programa simple y es genial. Sin embargo, no estoy en Windows, y no sé lo difícil que sería ponerlo en funcionamiento. Es bastante difícil, lo cual es una pena, ya que es genial y esencialmente lo que quieres. Si ponerlo en marcha, se puede obtener algo parecido a esta información de Sombrero:

    main = {IO} 
    teneven = [2,4,6,8,10] 
    _foldr (\..) [1,2,3,4,5,6,7,8, ...] [] = [2,4,6,8,10] 
    (\..) 1 [2,4,6,8,10] = [2,4,6,8,10] 
    (\..) 2 [4,6,8,10] = [2,4,6,8,10] 
    (\..) 3 [4,6,8,10] = [4,6,8,10] 
    (\..) 4 [6,8,10] = [4,6,8,10] 
    (\..) 5 [6,8,10] = [6,8,10] 
    (\..) 6 [8,10] = [6,8,10] 
    (\..) 7 [8,10] = [8,10] 
    (\..) 8 [10] = [8,10] 
    (\..) 9 [10] = [10] 
    (\..) 10 [] = [10] 
    

    La lambda no es even. Además, si lo desea, Hat puede rastrear en llamadas de foldr y otras llamadas internas; por defecto, no hace eso.

+0

Desafortunadamente, el sombrero no parece compilar en ghc 7.8.3 y el desarrollo parece haberse detenido a partir del 13 de noviembre de 2012. –

+0

¿Cómo lo compiló? La versión de la pila desencadena errores de compilación:/ –

+0

hat se instala bien para mí con el comando. 'cabal install hat --constraint =" haskell-src-exts <1.17 "'. –

2

Créanme, usted no quiere ir por este camino.

El conjunto (y el orden) de las reducciones utilizadas en cada caso particular dependerá de la implementación de un idioma particular (los abrazos pueden hacerlo de una manera, ghci - de otra manera, jhc - en otro, etc.).

mejor leer algo acerca de las formas generales para implementar compilador intérprete de la máquina// Virual de lenguaje funcional - como la máquina SECD, etc.

varios enlaces:

5

Aquí tiene algunos ejemplos del uso de Debug.Trace y Hugs.Observe.

import Debug.Trace 
fact :: Integer -> Integer 
fact 0 = trace "fact 0 ->> 1" 1 
fact n = trace ("fact " ++ show n) (n * fact (n-1)) 


import Hugs.Observe 
fact :: Integer -> Integer 
fact 0 = observe "fact 0" 1 
fact n = observe "fact n" (n * fact (n-1)) 

Espero que esto te ayude a descubrir cómo imprimir todas las reducciones usando WinHungs.

Cuestiones relacionadas