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

ツリー全部最新の50件前後を読む

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
  • 3Debug.Trace jmkjmk 2006/07/03 00:13:48
    まず、ghc と Hugs の機能にはそのようなものはなかったと記憶しています。そして、ほかの Haskell 実装には(たしか)対話環境がそもそもありません。 ただ、 ghc/Hugs にはい ...