Pregunta

He escrito la siguiente función ... y ejecuté utilizando WinHugs

teneven =  [x | x <- [1..10], even x]

Mi salida:

Main> teneven
[2,4,6,8,10] :: [Integer] 
(63 reductions, 102 cells)

¿hay alguna forma de imprimir todas las reducciones ... para que pueda aprender la evaluación central que se está realizando dentro de WinHugs?

¿Fue útil?

Solución

Algunas ideas:

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

  2. Pruebe Sombrero: el Haskell Tracer . Acabo de probarlo en un programa simple y es genial. Sin embargo, no estoy en Windows, y no sé lo difícil que sería hacerlo funcionar. Es probable que sea bastante difícil, lo cual es una pena, ya que es genial y esencialmente lo que quieres. Si lo hace funcionar, puede obtener algo como esta información de Hat:

    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 allí es incluso . Además, si lo desea, Hat puede rastrear las llamadas de foldr y otras llamadas internas; por defecto, no hace eso.

Otros consejos

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.

Créeme, no quieres ir por este camino.

El conjunto (y el orden) de las reducciones utilizadas en cada caso particular dependería de la implementación del lenguaje en particular (los abrazos podrían hacerlo de una manera, ghci, de otra manera, jhc, en otra, etc.).

Mejor lea algo sobre formas generales de implementar compilador / intérprete / máquina virtual para lenguaje funcional, como máquina SECD, etc.

Varios enlaces:

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top