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 中使用 lambdas 执行此操作(我在这里使用 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

可以说fg以下方法:

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

使用 lambda

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 回答