State'
いくつかのデータを使って私のプログラムの状態にしましょう。
type State' m a = StateT Int m a
いくつかの計算で使用します。
例:
-- genData, return some string (using Int value and State')
genData :: Int -> State' String
genData n = ...
-- genDatas, return multiple strings
genDatas :: Int -> State' [String]
genDatas n = mapM genData [1..n]
-- printLog, write log message (enumerating lines)
printLog :: String -> State' IO ()
printLog msg = do
n <- get
let n' = n + 1
put n'
liftIO $ putStrLn $ "Message #" ++ (show n') ++ ": " ++ msg
私はそれを行う正しい方法ではないと思います:
-- If I need a "in context function" returning a Int value...
--
-- addExtra, return current Int in state plus x
addExtra :: Int -> State' Identity Int
addExtra x = get >>= return.(+x)
addExtra
いくつかのモナドコンテキストで関数を使用するには、次のようにします。
doComplex :: State' IO ()
doComplex = do
printLog "Starting process..."
-- It's ugly!
s <- get
Identity (w, s') <- return $ runStateT (addExtra 5) s
put s' -- save state
printLog $ "computed value: " ++ (show w)
State'
さまざまな機能に沿ってモナドを共有する正しい方法は何ですか?(IO a
そうしているように)
ありがとうございました!
(私はいくつかのチュートリアルといくつかのソースコードを読みましたが、それを理解できません)