Skip to content

Instantly share code, notes, and snippets.

@tucaz
Created December 20, 2010 14:59
Show Gist options
  • Select an option

  • Save tucaz/748462 to your computer and use it in GitHub Desktop.

Select an option

Save tucaz/748462 to your computer and use it in GitHub Desktop.
StateMonad in F#
#light
namespace NParser
module StateMonad =
type State<'s,'a> = State of ('s -> ('a *'s))
let runState (State f) = f
type StateBuilder() =
member b.Return(x) = State (fun s -> (x,s))
member b.Delay(f) = f() : State<'s,'a>
member b.Zero() = State (fun s -> ((),s))
member b.Bind(State p,rest) = State (fun s -> let v,s2 = p s in (runState (rest v)) s2)
member b.Get () = State (fun s -> (s,s))
member b.Put s = State (fun _ -> ((),s))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment