2012-01-25 5 views
4

デバッグのために現在の状態値をどのように表示できますか?たとえば、http://www.haskell.org/haskellwiki/State_Monadのconcrete-example-1のコードでは、各入力文字の読み取り後に現在の状態値をどのように出力できますか?間に合わせのデバッグのためのデバッグ用の印刷状態値

module StateGame where 

import Control.Monad.State 

type GameValue = Int 
type GameState = (Bool, Int) 

playGame :: String -> State GameState GameValue 
playGame []  = do 
    (_, score) <- get 
    return score 

playGame (x:xs) = do 
    (on, score) <- get 
    case x of 
     'a' | on -> put (on, score + 1) 
     'b' | on -> put (on, score - 1) 
     'c'  -> put (not on, score) 
     _  -> put (on, score) 
    playGame xs 

startState = (False, 0) 

main = print $ evalState (playGame "abcaaacbbcabbab") startState 
+1

'Debug'から' trace'を試すことができます。 –

答えて

7

Debug.Traceからtraceを使用しています。私は、多くの場合、それは便利な引数の順序を反転させる。そして、あなたが行の最後にデバッグをタックすることができますし、それをコメントアウトする方が簡単です(とエンド削除時)

infixl 0 `debug` 

debug :: a -> String -> a 
debug = flip trace 

を定義見つけます。より多くの原則に基づいたログについては

WritertellログメッセージでStateを組み合わせたり、直接ファイルまたはstderrにログを記録するようにしたい場合はStateT s IOを使用しています。

2

n.m。 Debug.Traceがあると指摘していますが、自分で何かを書くのは簡単です。しかし、私は強くは、デバッグにのみこれを使用し、現実世界のコードのためにそれを削除することをお勧めします。次に例を示します。

import System.IO.Unsafe 

output a b = seq (unsafePerformIO (print a)) b 

(output "test" 23) * 25 
-- "test" 
-- 527 

ここoutputはただの副作用で、constように振る舞う、プリントアウトする引数、および戻り値をとります。 printの評価を強制するにはseqが必要です。そうでなければ怠惰は何も印刷しません。

+0

'Debug.Trace'はこの問題に関してより明示的です。 – is7s