Brian Beckman: The Zen of Stateless State - The State Monad - Part 2
- Posted: Nov 20, 2008 at 1:38 PM
- 102,798 Views
- 4 Comments
Loading User Information from Channel 9
Something went wrong getting user information from Channel 9
Loading User Information from MSDN
Something went wrong getting user information from MSDN
Loading Visual Studio Achievements
Something went wrong getting the Visual Studio Achievements
Right click “Save as…”
Exercise 2: go from labeling a tree to doing a constrained
container computation, as in WPF. Give everything a
bounding box, and size subtrees to fit inside their
parents, recursively.
Exercise 3: promote @return and @bind into an abstract
class "M" and make "SM" a subclass of that.
Exercise 4 (HARD): go from binary tree to n-ary tree.
Exercise 5: Abstract from n-ary tree to IEnumerable; do
everything in LINQ! (Hint: SelectMany).
Exercise 6: Go look up monadic parser combinators and
implement an elegant parser library on top of your new
state monad in LINQ.
Exercise 7: Verify the Monad laws, either abstractly
(pencil and paper), or mechnically, via a program, for the
state monad.
Exercise 8: Design an interface for the operators @return
and @bind and rewrite the state monad so that it implements
this interface. See if you can enforce the monad laws
(associativity of @bind, left identity of @return, right
identity of @return) in the interface implementation.
Exercise 9: Look up the List Monad and implement it so that it implements the same interface.
Exercise 10: deconstruct this entire example by using
destructive updates (assignment) in a discipline way that
treats the entire CLR and heap memory as an "ambient
monad." Identify the @return and @bind operators in this
monad, implement them explicitly both as virtual methods
and as interface methods.
Comments have been closed since this content was published more than 30 days ago, but if you'd like to continue the conversation,
please create a new thread in our Forums,
or
Contact Us and let us know.
Follow the Discussion
Oops, something didn't work.
What does this mean?
Following an item on Channel 9 allows you to watch for new content and comments that you are interested in. You need to be signed in to Channel 9 to use this feature.What does this mean?
Following an item on Channel 9 allows you to watch for new content and comments that you are interested in and view them all on your notifications page.sign up for email notifications?
http://en.wikipedia.org/wiki/Monadology
and monism
http://en.wikipedia.org/wiki/Monism
was helpful to me to get my head around what the heck a monad "is" (it turns out its pretty hard to define
http://en.wikipedia.org/wiki/Monad_(category_theory) and http://en.wikipedia.org/wiki/Monads_in_functional_programming are pretty good too
// F# code
#light
open System
open System.Text
// State Monad
// label a binary tree to demonstrate state-monad
// implement non-monadically and monadically
type Tree<'a> =
| Leaf of string*'a
| Branch of Tree<'a>*Tree<'a>
// prints binary tree
// val printTree : Tree<'a> -> unit
let printTree(a)=
let rec print(a,level)=
let emptyString =new String(' ',level*2)
printfn "%s" emptyString
match a with
|Leaf (sym,e)-> Console.Write(emptyString)
Console.Write("Leaf: "+sym+" ")
Console.Write(e.ToString())
Console.WriteLine()
|Branch (left,right) -> Console.Write(emptyString)
Console.WriteLine("Branch:");
print(left,level+1)
print(right,level+1)
print(a,2)
//non-monad version
let rec labelTreeNM(t,s) =
match t with
|Leaf(sym,_)-> let l=Leaf(sym,s)
(s+1,l)
|Branch(left,right)-> let(sL,nLeft)=labelTreeNM(left,s)
let(sR,nRight)=labelTreeNM(right,sL)
(sR+1,Branch(nLeft,nRight))
let demoTree=Branch(Leaf("A",0),Branch(Leaf("B",0),Branch(Leaf("C",0),Leaf("D",0))))
let (_,demoTreeNM)=labelTreeNM(demoTree,0)
//printTree(demoTreeNM)
// monad version
type State<'s,'a> = State of ('s ->'s*'a)
////type StateMonad =
// class
// new : unit -> StateMonad
// static member
// Bind : sm:State<'a,'b> * f:('b -> State<'a,'c>) -> State<'a,'c>
// static member Return : a:'a -> State<'b,'a>
// end
type StateMonad() =
static member Return(a) = State (fun s -> s, a)
static member Bind(sm,f) =
State (fun s0 ->let (s1,a1)= match sm with
| State h -> h s0
let (s2,a2)= match f a1 with
| State h->h s1
(s2,a2))
// succinct functors for state monad
//val ( >>= ) : State<'a,'b> -> ('b -> State<'a,'c>) -> State<'a,'c>
let (>>=)m f = StateMonad.Bind( m, f)
//val Return : 'a -> State<'b,'a>
let Return =StateMonad.Return
// Tree<'a> -> State<int,Tree<int>>
let rec mkMonad(t)
=match t with
|Leaf(sym,_) -> State(fun s->((s+1),Leaf(sym,s)))
|Branch(oldL,oldR)-> mkMonad(oldL)>>=
(fun newL->mkMonad(oldR) >>=
fun newR->Return(Branch(newL,newR)))
// monad version
let monadLabel(t,s)= let(nS,nT)= match mkMonad(t) with
| State f-> f(s)
nT
let mTree=monadLabel(demoTree,0)
printTree(mTree)
Look on YouTube. Category theory is used in Linear Algebra and most importantly quantum mechanics. You I suggest the Stanford University Open Course ware on Quantum Mechanics, there is also probability some good Linear Algebra open course wear at Stanford as well. Quantum Mechanics II Lecture series starts with a good opener on linear algebra, as it pertains to QED. All linear algebra operations are function operations of observable events. It does get much into category theory and complex math, but it is the 'real' stuff that is observable and that is what the course shows how to design mathematical proofs of. Here is the link to the courses:
Lecture 1 | Modern Physics: Quantum Mechanics (Stanford)
General Link:
http://www.youtube.com/user/StanfordUniversity
Linerar Algerbra:
Lecture 1 | Introduction to Linear Dynamical Systems
~Proto-Bytes
Remove this comment
Remove this thread
close