è possibile stampare tutte le riduzioni in Haskell - usando WinHugs?
-
03-07-2019 - |
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?
Soluzione
Alcune idee:
-
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. -
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 difoldr
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:
- Wikipedia, Macchina SECD
- Lambda the Ultimate, Implementazione di interpreti veloci