13

我正在尝试在 ruby​​ 中进行一些柯里化:

def add(a,b)
  return a+b
end

plus = lambda {add}
curry_plus = plus.curry
plus_two = curry_plus[2] #Line 24
puts plus_two[3]

我得到错误

func_test.rb:24:in `[]': wrong number of arguments (1 for 0) (ArgumentError)

来自 func_test.rb:24:in `'

但如果我这样做

plus = lambda {|a,b| a+ b}

它似乎工作。但是通过在使用 lambda 分配后打印 plus 两种方式都返回相同类型的对象。我误解了什么?

4

3 回答 3

18

你在正确的轨道上:

add = ->(a, b) { a + b }
plus_two = add.curry[2]
plus_two[4]
#> 6
plus_two[5]
#> 7

正如其他人指出的那样,plus您定义的 lambda 不带任何参数,并且调用不带参数的add方法。

于 2013-08-29T02:12:22.783 回答
10
lambda {|a,b| a+ b}

创建一个 lambda,它接受两个参数并返回调用+第一个参数的结果,第二个作为其参数。

lambda {add}

创建一个不带参数并调用add不带参数的 lambda,这当然是一个错误。

做你想做的,你应该做

plus = lambda {|x,y| add(x,y)}

或者

plus = method(:add).to_proc
于 2010-11-24T22:37:35.470 回答
4

当您编写 时lambda {add},您正在声明一个不带参数的 Proc,并且作为它的唯一操作,调用add不带参数。它不会add变成 Proc。另一方面,lambda {|a,b| a + b}返回一个接受两个参数并将它们相加的 Proc——因为它接受参数,所以将参数传递给那个是有效的。

我想你想要的是method(:add).to_proc.curry

于 2010-11-24T22:36:41.130 回答