Tradução: Compondo Funções em Ruby

2007 September 07, 17:58 h

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?

tags: obsolete

Comments

comentários deste blog disponibilizados por Disqus