2009-04-28 20 views
14

Haskell'deki azaltma adımlarını görüntülemenin bir yolu var mı, yani, tekrarlayan fonksiyon çağrılarını mı izlediniz? Örneğin, chez şeması bize trace-lambda sağlar. Haskell'de eşdeğer bir form var mı?Haskell'deki Azaltma Adımlarını Görüntüleme

+0

Şema ile büyük bir fark var; Haskell tembeldir, bu yüzden fiili değerlendirme çağrıdan çok sonra gerçekleşebilir. – bortzmeyer

cevap

7

İzlemek istediğiniz yerlere Debug.Trace.trace eklemeye çalışabilirsiniz, ancak bu, (a) izleyen şekilde çıktının çıktısını üretme eğilimine sahiptir, çünkü izleme ifadeniz şu ana kadar değerlendirilmeyen bir öğeye ait olabilir orijinal çağrısından çok uzakta ve (b) izleme, aksi takdirde değerlendirilemeyen şeyleri değerlendirmeyi gerektiriyorsa, programınızın çalışma zamanı davranışını değiştirir (henüz).

Bu hata ayıklama için mi?


Hat

çalıştırdıktan sonra izlenebilir çıktı izleme için kaynak kodunu değiştirir ... Eğer öyleyse. Çıktı istediğini oldukça yakın olmalıdır: kendi ana sayfasında örnek Örneğin

, hatalı programı

main = let xs :: [Int] 
      xs = [4*2,5 `div` 0,5+6] 
     in print (head xs,last' xs) 

last' (x:xs) = last' xs 
last' [x] = x 

hesaplanması olan bir sonuç verir

(8, No match in pattern. 

ve Şapka görüntüleme araçları aşağıdaki gibi davranışı keşfetmek için kullanılabilir:

  • durdurulmuş hesaplamalar için Şapka yığın

bu bir hata iletisi ile sona ya da kesintiye uğramış hesaplamalar olup, şapka-yığın içinde hesaplama iptal edildi çağrı işlev göstermektedir. Bu, sanal bir fonksiyon çağrıları yığını (redexes) göstererek yapar. Böylelikle, yığında gösterilen her işlev çağrısı, fonksiyon çağrısının onun üzerine çıkmasına neden olmuştur. Üst yığın elemanının değerlendirilmesi, hataya neden oldu (ya da değerlendirmesinde hesaplama kesintiye uğradı). Gösterilen yığın sanaldır, çünkü gerçek çalışma zamanı yığınına karşılık gelmez. Gerçek çalışma zamanı yığını, temkinli değerlendirme sağlarken, sanal yığın, istekli (katı) değerlendirme için kullanılacak bir yığına karşılık gelir.

$ ghci -fbreak-on-exception 
GHCi, version 6.10.1: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer ... linking ... done. 
Loading package base ... linking ... done. 
Prelude> :l Example.hs 
[1 of 1] Compiling Main    (Example.hs, interpreted) 

Example.hs:5:0: 
    Warning: Pattern match(es) are overlapped 
      In the definition of `last'': last' [x] = ... 
Ok, modules loaded: Main. 
*Main> :trace main 
(8,Stopped at <exception thrown> 
_exception :: e = _ 
[<exception thrown>] *Main> :back 
Logged breakpoint at Example.hs:(5,0)-(6,12) 
_result :: t 
[-1: Example.hs:(5,0)-(6,12)] *Main> :hist 
-1 : last' (Example.hs:(5,0)-(6,12)) 
-2 : last' (Example.hs:5:15-22) 
-3 : last' (Example.hs:(5,0)-(6,12)) 
-4 : last' (Example.hs:5:15-22) 
-5 : last' (Example.hs:(5,0)-(6,12)) 
-6 : last' (Example.hs:5:15-22) 
-7 : last' (Example.hs:(5,0)-(6,12)) 
-8 : main (Example.hs:3:25-32) 
-9 : main (Example.hs:2:17-19) 
-10 : main (Example.hs:2:16-34) 
-11 : main (Example.hs:3:17-23) 
-12 : main (Example.hs:3:10-33) 
<end of history> 
[-1: Example.hs:(5,0)-(6,12)] *Main> :force _result 
*** Exception: Example.hs:(5,0)-(6,12): Non-exhaustive patterns in function last' 

[-1: Example.hs:(5,0)-(6,12)] *Main> :back 
Logged breakpoint at Example.hs:5:15-22 
_result :: t 
xs :: [t] 
[-2: Example.hs:5:15-22] *Main> :force xs 
xs = [] 
: yukarıdaki ile aynı, örneğin programının kullanılması

, hat-yığını ayrıca bir hata ayıklayıcı ile birlikte, GHCi (≥ 6.8.1)

$ hat-stack Example 
Program terminated with error: 
     No match in pattern. 
Virtual stack trace: 
(Last.hs:6)  last' [] 
(Last.hs:6)  last' [_] 
(Last.hs:6)  last' [_,_] 
(Last.hs:4)  last' [8,_,_] 
(unknown)  main 
$ 

Bu gün gösterir

Güzel olmasa da, kolayca kullanılabilir olma ve kodunuzu yeniden derlemeden kullanılabilir olma avantajına sahiptir.

0

Eğer yardımcı olursa, kucaklamalarda bir azalma sayısı var mı? Alternatif olarak, her adımda ne yaptığına dair daha fazla ayrıntı elde etmek için, kodunuzu sarmak için kucaklama kaputu gibi bir şey kullanabilir miydiniz?

0

Bu tür hiçbir şey Haskell standardına dahil değildir.

Helium grafiksel yorumlayıcının böyle bir şey sunacağını umuyoruz, ancak web sayfası konuyla ilgili sessiz.

0

Kısmi bir çözüm, veri yapılarını görselleştirmek için vacuum kullanmaktır.

Katlama, tarama ve diğer bazı gif animasyonlarını gördüm, ancak şu anda onları bulamıyorum. Bence Cale Gibbard animasyonları yaptı.