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?

Foi útil?

Solução

Algumas ideias:

  1. 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.

  2. 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 de foldr 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:

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top