é possível imprimir todas as reduções em Haskell - usando WinHugs?
-
03-07-2019 - |
Pergunta
Eu escrevi a seguinte função .. e executado usando WinHugs
teneven = [x | x <- [1..10], even x]
A minha saída:
Main> teneven
[2,4,6,8,10] :: [Integer]
(63 reductions, 102 cells)
Há alguma maneira de imprimir todas as reduções .. para que eu possa aprender a avaliação do núcleo acontecendo dentro WinHugs?
Solução
Algumas ideias:
-
A opção de depuração de linha de comando (que você pode definir com
:set +d
em Hugs) é informativo, mas é muito detalhado e não mostra as reduções de sintaxe Haskell. -
Tente Hat - o Haskell Tracer . Eu apenas tentei em um programa simples e é muito legal. Eu não estou no Windows, embora, e eu não sei o quão difícil seria para obtê-lo correr. É provável bastante difícil, que é uma vergonha, uma vez que é legal e, essencialmente, o que você quer. Se você fizer obtê-lo correr, você pode obter algo como esta informação a partir 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]
O lambda há
even
. Além disso, se você quiser, pode traçar Hat em chamadas defoldr
e outras chamadas internas; por padrão, ele não faz isso.
Outras dicas
Aqui você tem alguns exemplos do uso de Debug.Trace e 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 isso ajude você a descobrir como imprimir todas as reduções usando WinHungs.
Acredite em mim, você não quer ir por esse caminho.
Set (e ordem) de reduções utilizadas em cada caso particular vai depender de especial implementação da linguagem (abraços poderia fazê-lo de uma maneira, ghci - de outra forma, JHC - em outro, etc).
Melhor ler algo sobre as formas gerais para a implementação do compilador / intérprete / virual máquina para linguagem funcional -. Como máquina de SECD, etc
Vários links:
- Wikipedia, máquina SECD
- Lambda the Ultimate, A implementação de intérpretes rápidos