Skip to content

Instantly share code, notes, and snippets.

@havenwood
Created April 5, 2016 06:40
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save havenwood/fd96e63ec60c15e07af85fc2f76f8ed7 to your computer and use it in GitHub Desktop.
Save havenwood/fd96e63ec60c15e07af85fc2f76f8ed7 to your computer and use it in GitHub Desktop.
class ZCombinator
def initialize improver
@improver = improver
end
def call gen
eat_its_tail(gen).(
->(gen) { @improver.(applicatively_eat_its_tail gen) }
).(gen)
end
private
def eat_its_tail gen
->(gen) { gen.(gen) }
end
def applicatively_eat_its_tail gen
->(_) { gen.(gen).(_) }
end
end
triangle = ZCombinator.new ->(partial) { ->(n) { n < 1 ? 0 : n + partial.(n.pred) } }
factorial = ZCombinator.new ->(partial) { ->(n) { n < 1 ? 1 : n * partial.(n.pred) } }
fibonacci = ZCombinator.new ->(partial) { ->(n) { n < 2 ? n : partial.(n.pred) + partial.(n.pred.pred) } }
Array.new(10) { |n| triangle.(n) }
#=> [0, 1, 3, 6, 10, 15, 21, 28, 36, 45]
Array.new(10) { |n| factorial.(n) }
#=> [1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880]
Array.new(10) { |n| fibonacci.(n) }
#=> [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment