...そもそも状態を更新するのはどうですか?何もせずにそこに座っているようです...
ああ、今私はあなたの質問を理解しています。あなたはput
(そしてget
)どのように機能するのか疑問に思っていますよね?
たぶんJavaScriptの例が役立つでしょう(実際の可変状態の言語):
var s; // mutable state
function get() { return s; }
function put(x) { s = x; }
function tick() {
var n = get();
put(n + 1);
return n;
}
n
これは、変更はありませんが、内部状態が更新されることを示していると思います。2回実行するtick()
と、状態が2回インクリメントされます。
Haskellに戻るために、State
モナドの(関連する部分)の完全な定義は次のとおりです。
newtype State s a = State { runState :: s -> (a, s) }
instance Monad (State s) where
return a = State $ \s -> (a, s)
m >>= k = State $ \s -> let
(a, r) = runState m s
in runState (k a) r
get = State $ \s -> (s, s)
put s = State $ \_ -> ((), s)
次に、、、およびを手動でインライン化して、tick
例をさらに拡張してみてください。うまくいけば、州がどのように機能するかがより明確になるでしょう。>>=
return
get
put