Rubyでポイントフリー続き

さっきとは少し変わってgとf関数はλにしてます。

def g
  ->x, y { x * y }.curry
end

def f
  ->y { y * 4 }
end

def foo(x, y)
   f.(g.(x).(y))
end

さて、このfoo(x,y)からxとyを取り除きます。
結果…

def foo
  ((f.<<).<<.(g)) #  f(g(x,y))
end

foo.(2).(2)
#=> 16

もう何をやっているのか分からないよ・・・。


関数合成のほうもλにしないと自分のRuby力じゃできなかったのでこうしました。

module ComposableFunction
# 元コード
#   def >>(g)
#     -> *args { g.to_proc.(self.to_proc.(*args)) }
#   end
#
#   def <<(g)
#     g.to_proc >> self
#   end
  def >>
    ->g { -> *args { g.to_proc.(self.to_proc.(*args)) } }
  end

  def <<
    ->g { g.to_proc.>>.(self) }
  end
end

[Proc, Method, Symbol].each do |klass|
  klass.send(:include, ComposableFunction)
end