質問:評価する過程を簡単に見る方法ってあるのでしょうか? RSSフィード
 

リスト表示 | ツリー表示
ツリー全部最新の50件

1tMiyatMiya   質問:評価する過程を簡単に見る方法ってあるのでしょうか?

 Haskell遅延評価して値を計算する過程を、判りやすく表示してくれるツールなりライブラリとか、もしご存知の方があれば教えて頂けないでしょうか?

 例えて言うと、square (3+4) -> (3+4)*(3+4) -> 7*7 -> 49 みたいな変形の過程が見えるようなツールがあればいいなぁ、ということなのですが。

返信2006/07/02 20:34:41

2muscovyduckmuscovyduck   schemeのtraceのようなものが欲しい

ちょっと趣旨は違うのかもしれませんが、私も「どのように評価されていくのか」がわかるようなツールがあれば欲しいと思っています。

たとえばschemeのtraceのようなもの

http://blog.livedoor.jp/dankogai/archives/50458135.html

は、Haskellには存在しないのでしょうか。

ご存知の方がいらっしゃいましたら、是非ともご教授ください。

返信2006/07/02 23:08:05

3jmkjmk   Debug.Trace

まず、ghcHugs の機能にはそのようなものはなかったと記憶しています。そして、ほかの Haskell 実装には(たしか)対話環境がそもそもありません。

ただ、 ghc/Hugs にはいちおう Debug.Trace モジュールというのがあり、 trace 関数というのが用意されてはいます。

trace :: String -> a -> a

ただし、これは printf デバッグみたいなものなので、 scheme の trace のようなものではありません。第一引数の文字列を表示してから、第二引数の値を返します。使い方はこんな感じ。

 fact_p 0 = trace "=> 1" 1
 fact_p n = trace ("<= " ++ show n) $ n * fact_p (n-1)

なぜこのようなことになっているかというと、 trace が一般に非常に難しい問題をはらんでいるからでしょう。 Haskell遅延評価言語なのですが、表示をするためには何らかの値が必要となり、その結果として評価順序が本来の計算と変わる可能性もあるからです。

たとえば、たらいまわし関数を trace しようとすると、どうなるのでしょうか。どうなるべきでしょうか。

などなど、一筋縄では行かない問題があるためではないかと思っています。実際、 trace 関数も簡単そうに見えて、使ってみたら意外なところで値を評価してしまって頭を抱えた、みたいなことがありました。


ちなみに、実際に(概念上)どのように簡約されていくか、という過程については英語のHaskellの本ではそれなりに説明されていることがあります。

返信2006/07/03 00:13:48

4dimagekidimageki   Hat

Hat - the Haskell Tracer http://www.haskell.org/hat/

というのがあります。

Hat をインストールする

洗練された Linux distribution を使えば簡単ですが、そうでないひとは

  1. ghc http://www.haskell.org/ghc/ をインストール
  2. hmake http://www.cs.york.ac.uk/fp/hmake/ をインストール
  3. hat をインストール

の手順で導入する必要があります。

hmake は ghc でないコンパイラもサポートしていますが、hat を使うなら

ghc で十分だと思われます。

hat 2.04 の configure にはバグがあります。もしもインストールに失敗したら

  • lib/YOUR_PLATFORM/config の GHCSYM= の行を編集
    • 余計な改行をとりのぞき、 GHCSYM=604 にする
  • src/hatlib/Makefile の CPPFLAGS を編集
    • 該当行の ghcsym を cat している部分を 604 を代入することに変える

ことで、成功するかもしれません。

Hat を使う

  1. ソースを書く
    1. トレースは main 実行時に作られるので、中身を見たい関数を main で評価する
  2. 実行ファイルを作る
    1. hmake -hat progname
    2. progname はファイル名から.hs をのぞいた名前を指定すること
    3. プログラム progname ができあがるので実行
  3. hat-observe progname

hat-observe の使い方は hat のページにマニュアルがあります。

ためしに square(3+4) の例をやってみると次のようになります。

-- Sample.hs

main = do print (show foo)

return ()

foo :: Int

foo = square (3+4)

square :: Int -> Int

square x = x * x

% hmake -hat Sample

% ./Sample

% hat-observe Sample

hat-observe 2.04 (:? for help, :q to quit)

hat-observe> square

square 7 = 49

hat-observe>

hat のページにパターンマッチの展開の具体例が載っています。

返信2006/08/07 01:09:00

5mr_konnmr_konn   そんなものが

そんな物があるんですねえ。便利そうだ。

Data.Mapを使ったプログラムに適用してみようとしたら、hatのライブラリの中にないといわれたのですが、どうやって組み込めばいいのでしょうか?

返信2006/09/21 01:17:54