07
ruby# func_composition.rb
Tradução: Compondo Funções em Ruby
Posted on September 07, 2007
publicado por Tom Moertel em 07/04/06
Uma das coisas que eu sinto falta quando codifico em Ruby são composições baratas de função. Em Haskel, por exemplo, eu posso compor funções usando o operador ponto (.):
inc = (+1)
twice = (*2)
twiceOfInc = twice . inc
Por causa das classes abertas de Ruby, entretanto, eu posso facilmente adicionar essa funcionalidade à linguagem. No código abaixo, eu apresento Proc.compose e sobreponho o operador asterisco (*) para o propósito:
ruby# func_composition.rb
class Proc
def self.compose(f, g)
lambda { |args| f[g[args]] }
end
def *(g)
Proc.compose(self, g)
end
end
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
E é só isso:
--- ruby$ irb -r func_composition.rb
irb(main):001:0> inc = lambda { |x| x + 1 }
=> #<Proc:0x00002aaaaaad7810@(irb):1>
irb(main):002:0> twice = lambda { |x| x * 2 }
=> #<Proc:0x00002aaaaabd2d18@(irb):2>
irb(main):003:0> inc[1]
=> 2
irb(main):004:0> twice[2]
=> 4
irb(main):005:0> twice_of_inc = twice * inc
=> #<Proc:0x00002aaaaab32458@./func_composition.rb:3>
irb(main):006:0> twice_of_inc[1]
=> 4
irb(main):007:0> twice_of_inc[2]
=> 6
|
Agora, como isso não é revigorador?
blog comments powered by Disqus
Archives
- February 12(2)
- December 11(1)
- November 11(4)
- October 11(6)
- September 11(5)
- August 11(1)
- July 11(5)
- May 11(4)
- April 11(11)
- March 11(4)
- February 11(3)
- January 11(4)
- December 10(9)
- November 10(2)
- October 10(10)
- September 10(4)
- August 10(6)
- July 10(14)
- June 10(16)
- May 10(8)
- April 10(14)
- March 10(9)
- February 10(6)
- January 10(14)
- December 09(10)
- November 09(10)
- October 09(7)
- September 09(19)
- August 09(4)
- July 09(12)
- June 09(7)
- May 09(12)
- April 09(11)
- March 09(9)
- February 09(9)
- January 09(12)
- December 08(14)
- November 08(20)
- October 08(15)
- September 08(18)
- August 08(25)
- July 08(13)
- June 08(21)
- May 08(29)
- April 08(27)
- March 08(12)
- February 08(32)
- January 08(31)
- December 07(27)
- November 07(30)
- October 07(25)
- September 07(28)
- August 07(16)
- July 07(15)
- June 07(16)
- May 07(7)
- April 07(13)
- March 07(8)
- February 07(9)
- January 07(24)
- December 06(17)
- November 06(17)
- October 06(15)
- September 06(38)




