Aplicando una Función a un Enumerable

En el ejemplo que sigue escribimos un módulo Functional que usamos para extender las clases Proc y Method con dos operaciones.

  1. La operación f <= a toma una operación binaria implantada via una lambda, proc o method f como primer operando y un enumerable a como segundo. Retorna el resultado de operar todos los elementos de a con f (esto es hace una reducción):
    1] pry(main)> require './functional'
    => true
    [2] pry(main)> a = 1..5
    => 1..5
    [3] pry(main)> sum = lambda { |x,y| x+y }
    => #<Proc:0x007f94ef3b8018@(pry):3 (lambda)>
    [4] pry(main)> sum <= a
    => 15
    
  2. La operación f | a aplica el Proc f a cada uno de los elementos del enumerable a retornando un enumerable:
    14] pry(main)> a = 1..5
    => 1..5
    [15] pry(main)> h = lambda { |x| 2*x }
    => #<Proc:0x007fd19ca482b8@(pry):14 (lambda)>
    [16] pry(main)> h | a
    => [2, 4, 6, 8, 10]
    

Sigue un ejemplo de uso mas complicado:

if __FILE__ == $0
  a = (1..5).to_a
  sum = lambda {|x,y| x+y }        # A function to add two numbers
  mean = (sum<=a)/a.size.to_f      # Or sum.reduce(a) or a.inject(&sum)
  puts mean                        # 3.0
  deviation = lambda {|x| x-mean } # Function to compute difference from mean
  print "#{deviation|a}\n"         # [-2, -1, 0, 1, 2]
  square = lambda {|x| x*x }       # Function to square a number
  puts (sum<=square|(deviation|a)) # 10 = 4 + 1 + 4 + 1
  standardDeviation = Math.sqrt((sum<=square|(deviation|a)).to_f/(a.size-1))
  puts standardDeviation           # sqrt(10/4) = 1.5811388300841898
end

Esta es la solución a los requisitos especificados:

[~/Chapter6MethodsProcsLambdasAndClosures]$ cat -n functional.rb | head -16
     1  module Functional
     2  
     3    def apply(enum)
     4      enum.map &self
     5    end
     6    alias | apply
     7  
     8    def reduce(enum)
     9      enum.inject &self
    10    end
    11    alias <= reduce
    12  end
    13  
    14  # Add these functional programming methods to Proc and Method classes.
    15  class Proc; include Functional; end
    16  class Method; include Functional; end

Casiano Rodriguez León 2015-01-07