5

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 に同様の構文はありますか?

4

3 に答える 3

8

これは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の強みではないことに注意してください。それは可能ですが、私の意見では少し厄介に見えます。

于 2012-12-18T20:10:11.083 に答える
3

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. 詳細はこちら

于 2012-12-18T20:04:24.980 に答える
2

ラムダを使用する

def compose1(f,g)
  return lambda{ |x| f.call(g.call(x)) }
end

ランニングの例

compose1(lambda{|a| a + 1}, lambda{|b| b + 1}).call(1)
于 2012-12-18T20:11:01.430 に答える