Skip to content

Instantly share code, notes, and snippets.

@rgm
Created May 6, 2015 00:26
Show Gist options
  • Save rgm/ad998cd31c958eac6e2a to your computer and use it in GitHub Desktop.
Save rgm/ad998cd31c958eac6e2a to your computer and use it in GitHub Desktop.
# https://www.youtube.com/watch?v=FITJMJjASUs
puts ->() {
pred = ->(n) { n - 1 } # let's pretend no operators
fact_improver = ->(partial) {
->(n) { n.zero? ? 1 : n * partial.(pred.(n)) }
}
fib_improver = ->(partial) {
->(n) { n.zero? ? 0 : ((pred.(n)).zero? ?
1 : partial.(pred.(n)) + partial.(pred.(pred.(n)))) }
}
z = ->(improver) {
->(generator) { generator.(generator) }.(
->(generator) { improver.(->(v) { generator.(generator).(v) }) } ) }
# no v wrapper needed in normal-order lang
# more canonical applicative form
# some no-op immediately-invoked functional wrappers for symmetry
z_combinator = ->(f) {
->(x) { f.(->(v) { x.(x).(v) }) }.(
->(x) { f.(->(v) { x.(x).(v) }) }) }
fact = z_combinator.(fact_improver)
fact = fact_improver.(fact) # what it even means to be a fixpoint
fib = z.(fib_improver)
fib = fib_improver.(fib) # what it even means to be a fixpoint
[fact.(5), fib.(7)] # expect => 120, 13
}.()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment