2009-04-28 17 views
14

にハスケルの減少のステップを表示するには、どのような方法があり、すなわちが行わ再帰関数呼び出しをトレース?例えば、chezスキームはtrace-lambdaを提供します。ハスケルに相当するフォームがありますか?それは場合に役立ちます見る削減ステップハスケル

+0

Schemeには大きな違いがあります。ハスケルは怠惰なので、実際の評価は呼び出しの後で発生する可能性があります。 – bortzmeyer

答えて

7

Debug.Trace.traceをトレースしたい場所に挿入してみることもできますが、トレースステートメントが遠くまで評価されていないサンクに属する可能性があるため、(a) (まだ)評価されていなかったものを評価する必要がある場合は、プログラムの実行時の動作を変更します。

は、デバッグのために、このですか?そうであれば...

Hat実行後に表示できる出力トレースにソースコードを変更します。出力は、あなたが望むものにかなり近いようになります。自分のホームページ上の例では、例えば

で、障害のあるプログラム

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 

の計算は、結果

(8, No match in pattern. 

を与え、次のようにハット表示ツールは、その動作を探索するために使用することができます:

  • 中断された計算のためハットスタック

、そのエラーメッセージで終了または中断された計算され、帽子スタックとは、計算が中止された呼び出し機能を示しています。これは、関数呼び出しの仮想スタック(redexes)を表示することによって行われます。したがって、スタック上に表示されるすべての関数呼び出しは、その上に関数呼び出しを引き起こしました。最上位のスタック要素の評価によってエラーが発生しました(または評価中に計算が中断されました)。表示されるスタックは、実際のランタイムスタックに対応していないため、仮想です。実際のランタイムスタックはレイジー評価を可能にするが、仮想スタックは熱心な(厳密な)評価に使用されるスタックに対応する。

$ 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 = [] 
:上記と同じサンプル・プログラムを使用し

は、ハット・スタックはまた、デバッガが付属して、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 
$ 

これら日を示します

いいえ、それは簡単ではありませんし、コードを再コンパイルせずに使えるという利点があります。

0

抱擁の減少数は、ありますか? また、コードをラップして各ステップで何をしているのか詳細を知るために、ハグフードのようなものを使用できますか?種類の

0

何もHaskellの標準に組み込まれていません。

私はHeliumグラフィカルなインタプリタはこのようなものを提供することを望んでいるだろうが、Webページが話題に沈黙しています。

0

部分的な解決策は、vacuumを使用してデータ構造を視覚化することです。

私はfold、scanなどのgifアニメーションをいくつか見てきましたが、現時点では見つかりませんでした。私はCale Gibbardがアニメーションを作ったと思う。