2013-05-27 17 views
7

Bunu nasıl soracağımdan emin değilim, ama bir thunk yapısını göstermenin bir yolu var mı? ÖrneğinBir thunk/işlevi "görselleştirmek" için herhangi bir yolu? Ya da genel bir argüman için bir işlevi nasıl görüntüleyeceğiniz

f x = x + 2 
g x = 3 x 

compo x = f (g x) 

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

için

Ben ans için thunk "görmek" bir yolu var mı? İçinde olduğu gibi, compo için beta redüksiyon sürecini veya "genel" formunu görebiliyordum.

Ben örneğin, görmek istiyorum:

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

gibi de, ben bir işlevi compo x olsaydı, ben (3*n)+2 parçalanır olduğunu görmek istiyorum. Örneğin, Mathematica

: Genel olarak

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

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

cevap

8

bir görselleştirme göstermek hackage üzerinde ghc-vis paket var senin yığın ve unevaluated thunks.

package on hackage veya Homepage'a bakın (oldukça etkileyici örnekler içerir).

1

(biz Haskell kodu bahsediyoruz) Ben diğer yandan, bu son thunk akışı farklı veri girişi için farklı olacaktır duygusu yok düşünmek ve el, fonksiyonlar kısmen genişletilmiştir (fonksiyonlar sadece basit ifadeler değildir). Sadece indirimleri dizisini görmek istiyorsanız

Neyse, sen GHCi interaktif debugger kullanarak deneyebilirsiniz, bunu (ama çirkin)

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

benzetilebilir. Bu tipik IDE ayıklayıcıyla neredeyse kadar kolay değil (O. Yerde GHC kılavuzda var), ama az ya da çok işler ...

İlgili konular