2012-04-21 11 views

答えて

11

import Debug.Trace 

funct :: Integer -> [Integer] -> Bool 
funct a list = trace (show list) $ funct (a + 1) (a : list) 

trace :: String -> a -> aがあります。これは、フードの下でunsafePerformIOを使用するので、デバッグのためには悪いです。です。

遅延評価のため、デバッグ出力が驚くべき順序で表示され、プログラムが通常生成する出力がインターリーブされることに注意してください。

module TraceIt where 

import Debug.Trace 

funct :: Integer -> [Integer] -> Bool 
funct 10 list = null list 
funct a list = trace (show list) $ funct (a + 1) (a : list) 

予想通り、私は

*TraceIt> funct 1 [] 
[] 
[1] 
[2,1] 
[3,2,1] 
[4,3,2,1] 
[5,4,3,2,1] 
[6,5,4,3,2,1] 
[7,6,5,4,3,2,1] 
[8,7,6,5,4,3,2,1] 
False 

を取得します。

+0

私は再帰的に行って、最後の呼び出しのみを表示するガードに入ると、最後の呼び出しでのみ機能します。どのようにしてすべての呼び出しを表示できますか? – exilonX

+0

これは非常に驚くべきことです。トレース文字列が一定で、最適化でコンパイルしない限り、それは正常です。上記の場合、私はすべての呼び出しでトレース出力を取得します。 –

+0

私の間違い申し訳ありません:) – exilonX

1

ダニエルフィッシャーと同じですが、unsafePerformIOのみとなります。

> import System.IO.Unsafe 
> let funct a list = unsafePerformIO $ do { print list; return $ funct (a + 1) (a : list) } 

similar questionを見てみましょうあなたはunsafePerformIOを使用するときには本当に何が起こっているかを説明します。

関連する問題