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)