Ruby中的简单Currying

Mat*_*tyW 12 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]
Run Code Online (Sandbox Code Playgroud)

我收到了错误

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

来自func_test.rb:24:in''

但如果我这样做

plus = lambda {|a,b| a+ b}
Run Code Online (Sandbox Code Playgroud)

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

小智 12

你走在正确的轨道上:

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

正如其他人所指出的那样,plus你定义的lambda不接受任何参数,并且不带参数调用该add方法.


sep*_*p2k 10

lambda {|a,b| a+ b}
Run Code Online (Sandbox Code Playgroud)

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

lambda {add}
Run Code Online (Sandbox Code Playgroud)

创建一个不带参数的lambda和没有参数的调用add,当然这是一个错误.

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

plus = lambda {|x,y| add(x,y)}
Run Code Online (Sandbox Code Playgroud)

要么

plus = method(:add).to_proc
Run Code Online (Sandbox Code Playgroud)