Простой каррирование в Ruby
Я пытаюсь сделать currying в 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)
from func_test.rb: 24: in `'
Но если я делаю
plus = lambda {|a,b| a+ b}
Кажется, что сработало. Но при печати плюс после присвоения лямбдой оба пути возвращают один и тот же тип объекта. Что я неправильно понял?
Ответы
Ответ 1
lambda {|a,b| a+ b}
Создает лямбда, которая принимает два аргумента и возвращает результат вызова +
на первом, а второй - как аргументы.
lambda {add}
Создает лямбду, которая не принимает аргументов и вызывает add
без аргументов, что, конечно, является ошибкой.
Чтобы сделать то, что вы хотите, вы должны сделать
plus = lambda {|x,y| add(x,y)}
или
plus = method(:add).to_proc
Ответ 2
Вы на правильном пути:
add = ->(a, b) { a + b }
plus_two = add.curry[2]
plus_two[4]
#> 6
plus_two[5]
#> 7
Как указывали другие, plus
lambda, который вы определили, не принимает никаких аргументов и вызывает метод add
без аргументов.
Ответ 3
Когда вы пишете lambda {add}
, вы объявляете Proc, который не принимает аргументов и, как единственное действие, вызывает add
без аргументов. Он не превращает add
в Proc. С другой стороны, lambda {|a,b| a + b}
возвращает Proc, который принимает два аргумента и добавляет их вместе - поскольку он принимает аргументы, он действителен для передачи аргументов этому.
Я думаю, что вы хотите method(:add).to_proc.curry
.