From: MenTaLguY Date: 2007-06-08T02:36:37+09:00 Subject: Re: [SOLUTION][QUIZ] FizzBuzz (#126) [solution #2] On Thu, 7 Jun 2007 20:45:04 +0900, Brad Phelan wrote: > Are they real lists as in Ruby Array which I doubt or abstract concepts like > the Church Numerals. In some sense, these things are only as abstract as you want them to be. Instead of implementing Church numerals like this (expanded a bit for clarity): ZERO = LAMBDA2 { |f,x| x } ONE = LAMBDA2 { |f,x| f[x] } SUCC = LAMBDA { |n| LAMBDA2 { |f,x| f[n[f][x]] } } ADD = LAMBDA2 { |m,n| m[SUCC][n] } MULTIPLY = LAMBDA2 { |m,n| LAMBDA2 { |f,x| m[n[f]][x] } } POWER = LAMBDA2 { |m,n| n[m] } I could also have done something like this: class ChurchNumeral attr_reader :value def initialize(value) @value = value end def call(f) LAMBDA { |x| @value.times { x = f[x] } ; x } end alias [] call end ZERO = ChurchNumeral.new 0 ONE = ChurchNumeral.new 1 SUCC = LAMBDA do |n| if ChurchNumeral === n ChurchNumeral.new n.value + 1 else LAMBDA2 { |f,x| f[n[f][x]] } end end ADD = LAMBDA2 do |m,n| if ChurchNumeral === m and ChurchNumeral === n ChurchNumeral.new m.value + n.value else m[SUCC][n] end end MULTIPLY = LAMBDA2 do |m,n| if ChurchNumeral === m and ChurchNumeral === n ChurchNumeral.new m.value * n.value else LAMBDA2 { |f,x| m[n[f]][x] } end end POWER = LAMBDA2 do |m,n| if ChurchNumeral === m and ChurchNumeral === n ChurchNumeral.new m.value ** n.value else n[m] end end As described in my previous email, I did take the former sort of approach for lists though. -mental