新スレ記念にState Monadを作ってみましたよ。( ゚д゚)ノ

#light

type State<'s, 'a> = ST of ('s -> ('a * 's))
 with
  static member Run (ST x) = x
  static member Get () = ST <| fun s -> (s, s)
  static member Put s = ST <| fun _ -> ((), s)
  static member Eval x = State.Run x >> fst
  static member Exec x = State.Run x >> snd

type StateBuilder () =
 member b.Return a = ST <| fun s -> (a, s)
 member b.Bind (ST x, f) = ST <| fun s -> let (a, s') = x s in State.Run (f a) s'
 member b.Let (x, f) = f x

let state = StateBuilder ()

let _ =
 state
  { let x = 100
   let! s = State.Get ()
   do! State.Put (x + s)
   return () }
 |> State.Exec <| 1000
 |> (print_any >> print_newline)


(実行結果)
1100