Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
State Monad in CoffeeScript
push = (element) -> (stack) ->
newStack = [element].concat stack
{value: element, stack: newStack}
pop = (stack) ->
element = stack[0]
newStack = stack.slice 1
{value: element, stack: newStack}
bind = (stackOperation, continuation) -> (stack) ->
opResult = stackOperation stack
(continuation opResult.value) opResult.stack
result = (value) -> (stack) ->
{value: value, stack: stack}
initialStack = []
computation1 = bind \
(push 4), -> bind \
(push 5), -> bind \
pop, (a) -> bind \
pop, (b) ->
result a + ":" + b
computation2 = bind \
(push 2), -> bind \
(push 3), -> bind \
pop, (a) -> bind \
pop, (b) ->
result a + ":" + b
composed = bind \
computation1, (a) -> bind \
computation2, (b) ->
result a + ":" + b
finalResult = composed initialStack
console.log finalResult.value
@weidagang
Copy link

weidagang commented Oct 10, 2013

Very Cool!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment