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
4

2 に答える 2

7

迅速で汚いデバッグには、fromを使用traceDebug.Traceます。引数の順序を逆にして定義すると便利なことがよくあります

infixl 0 `debug`

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

次に、デバッグを行の最後に追加すると、コメントアウト(および最後に削除)が簡単になります。

Stateより原理的なロギングについては、Writertellロギングメッセージを組み合わせるStateT s IOか、ファイルまたはstderrに直接ロギングする場合に使用します。

于 2012-01-25T12:23:08.033 に答える
2

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

import System.IO.Unsafe

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

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

ここでoutputは、出力するための引数とconst、副作用があるだけで、のように動作する戻り値を取ります。seqの評価を強制するために必要です。そうでprintない場合、怠惰は何も印刷できなくなります。

于 2012-01-25T12:24:01.310 に答える