Ruby中的简单Currying

时间:2010-11-24 22:26:30

标签: ruby currying

我正试图在红宝石中做一些讨论:

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:在''

但如果我这样做

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

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

3 个答案:

答案 0 :(得分:10)

你走在正确的轨道上:

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

正如其他人所指出的那样,你定义的plus lambda不接受任何参数,并且在没有参数的情况下调用add方法。

答案 1 :(得分:9)

lambda {|a,b| a+ b}

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

lambda {add}

创建一个不带参数的lambda,并在没有参数的情况下调用add,这当然是错误的。

要做你想做的事,你应该做

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

plus = method(:add).to_proc

答案 2 :(得分:4)

当您编写lambda {add}时,您声明一个不带参数的Proc,并且作为其唯一操作,调用add而没有参数。它不会将add转换为Proc。另一方面,lambda {|a,b| a + b}返回一个带有两个参数的Proc并将它们加在一起 ​​- 因为它接受参数,将参数传递给那个参数是有效的。

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