2013-05-27 16 views
7

Non sono completamente sicuro di come chiedere questo, ma c'è un modo per mostrare la struttura di un thunk?Un modo per "visualizzare" un thunk/funzione? O come visualizzare una funzione per un argomento generale

Per esempio

f x = x + 2 
g x = 3 x 

compo x = f (g x) 

ans = compo 5 
-- result: (3 * 5) + 2 = 17 

Esiste un modo ho potuto "vedere" il thunk per ans? Come in, ho potuto vedere il processo della riduzione beta per compo o come il modulo "generale".

desidero vedere, per esempio:

compo n 
--> (3 * n) + 2 

Come in, se avevo una funzione compo x, desidero vedere che si decompone a (3*n)+2.

Per esempio, in Mathematica:

f[x_] := x+2; 
g[x_] := 3*x; 
compo[x_] := f[g[x]]; 

compo[n] 
(% 
    --> (3 * n) + 2 
%) 

risposta

8

C'è il GHC-vis pacchetto su hackage che mostrano una visualizzazione della vostra mucchio e di thunks non valorizzati.

Vedere package on hackage o Homepage (che contiene esempi piuttosto impressionanti).

1

In generale (stiamo parlando di codice Haskell) Penso che abbia alcun senso, il flusso di thunk finale sarà diverso per i diversi dati di input e, dall'altra mano, le funzioni vengono espanse parzialmente (le funzioni non sono solo espressioni semplici).

In ogni caso, è possibile simulare (ma brutto)

Prelude> :set -XQuasiQuotes 
Prelude> :set -XTemplateHaskell 
Prelude> import Language.Haskell.TH 
Prelude> import Language.Haskell.TH.Quote 
Prelude> runQ [| $([|\x -> 3 * x|]) . $([|\y -> y + 2|]) |] 
InfixE (Just (LamE [VarP x_0] (InfixE (Just (LitE (IntegerL 3))) (VarE GHC.Num.*) (Just (VarE x_0))))) (VarE GHC.Base..) (Just (LamE [VarP y_1] (InfixE (Just (VarE y_1)) (VarE GHC.Num.+) (Just (LitE (IntegerL 2)))))) 
2

Se si desidera solo per vedere la sequenza delle riduzioni, si potrebbe provare a utilizzare il debugger interattivo GHCi. (E 'nel manuale GHC da qualche parte.) Non è quasi facile come il debugger tipico IDE, ma più o meno opere ...

Problemi correlati