:デバッグのためHaskellのデバッグ、私は例えば、すべてのコールで、Haskellではリストか何かを印刷することができますどのように
funct a list = funct (a + 1) (a : list)
print list here ??????? but how ?
:デバッグのためHaskellのデバッグ、私は例えば、すべてのコールで、Haskellではリストか何かを印刷することができますどのように
funct a list = funct (a + 1) (a : list)
print list here ??????? but how ?
、
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
を取得します。
ダニエルフィッシャーと同じですが、unsafePerformIO
のみとなります。
> import System.IO.Unsafe
> let funct a list = unsafePerformIO $ do { print list; return $ funct (a + 1) (a : list) }
similar questionを見てみましょうあなたはunsafePerformIO
を使用するときには本当に何が起こっているかを説明します。
私は再帰的に行って、最後の呼び出しのみを表示するガードに入ると、最後の呼び出しでのみ機能します。どのようにしてすべての呼び出しを表示できますか? – exilonX
これは非常に驚くべきことです。トレース文字列が一定で、最適化でコンパイルしない限り、それは正常です。上記の場合、私はすべての呼び出しでトレース出力を取得します。 –
私の間違い申し訳ありません:) – exilonX