En el ejemplo que sigue escribimos un módulo
Functional
que usamos para extender
las clases Proc y Method con dos operaciones.
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
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