Python を学習した後で Ruby を学習しようとしていますが、このコードを Ruby に変換するのに問題があります。
def compose1(f, g):
"""Return a function h, such that h(x) = f(g(x))."""
def h(x):
return f(g(x))
return h
ブロックを使用してこれを翻訳する必要がありますか? または、Ruby に同様の構文はありますか?
これはRubyのラムダで行うことができます(ここでは1.9 stabby-lambdaを使用しています):
compose = ->(f,g) {
->(x){ f.(g.(x)) }
}
compose
あなたの例のように、別の関数を返す関数もそうです:
f = ->(x) { x + 1 }
g = ->(x) { x * 3 }
h = compose.(f,g)
h.(5) #=> 16
関数型プログラミングは実際にはRubyの強みではないことに注意してください。それは可能ですが、私の意見では少し厄介に見えます。
f
とはg
次のメソッドです。
def f(x)
x + 2
end
def g(x)
x + 3
end
次のように定義できますcompose1
。
def compose1(f,g)
lambda { |x| send(f, send(g, x) ) }
end
これが機能するには、h を次のように定義する必要があります。
h = compose1(:f, :g)
動作させるには、メソッド名を文字列/シンボルとして渡す必要がありますsend
。次に、次のことができます
h.call 3 # => 8
. 詳細はこちら
ラムダを使用する
def compose1(f,g)
return lambda{ |x| f.call(g.call(x)) }
end
ランニングの例
compose1(lambda{|a| a + 1}, lambda{|b| b + 1}).call(1)