Domanda

Ho scritto la seguente funzione ... ed eseguita usando WinHugs

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

La mia uscita:

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

c'è comunque da stampare tutte le riduzioni .. così posso imparare la valutazione di base in corso all'interno di WinHugs?

È stato utile?

Soluzione

Alcune idee:

  1. L'opzione della riga di comando di debug (che puoi impostare con : set + d in Hugs) è informativa, ma è molto dettagliata e non mostra le riduzioni nella sintassi di Haskell.

  2. Prova Hat - the Haskell Tracer . L'ho appena provato con un semplice programma ed è piuttosto bello. Non sono su Windows, però, e non so quanto sia difficile farlo funzionare. Probabilmente è abbastanza difficile, il che è un peccato poiché è bello ed essenzialmente quello che vuoi. Se riesci a farlo funzionare, puoi ottenere qualcosa come queste informazioni da 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 è pari . Inoltre, se lo desideri, Hat può tracciare le chiamate di foldr e altre chiamate interne; per impostazione predefinita, non lo fa.

Altri suggerimenti

Ecco alcuni esempi dell'uso di 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))

Spero che questo ti aiuti a capire come stampare tutte le riduzioni usando WinHungs.

Credimi, non vuoi andare in questo modo.

L'insieme (e l'ordine) di riduzioni utilizzate in ciascun caso particolare dipenderebbe dall'implementazione del linguaggio particolare (gli abbracci potrebbero farlo in un modo, ghci - in un altro modo, jhc - in un altro ancora, ecc.)

Meglio leggere qualcosa sui modi generali per implementare compilatore / interprete / macchina virtuale per un linguaggio funzionale - come una macchina SECD, ecc.

Diversi collegamenti:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top