Простое карри в рубине - PullRequest
       1

Простое карри в рубине

11 голосов
/ 25 ноября 2010

Я пытаюсь сделать карри в 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}

Кажется, это работает.Но, печатая плюс после присвоения с помощью лямбды, оба способа возвращают один и тот же тип объекта.Что я неправильно понял?

Ответы [ 3 ]

10 голосов
/ 29 августа 2013

Вы на правильном пути:

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

Как уже отмечали другие, определенная вами лямбда plus не принимает никаких аргументов и вызывает метод add без аргументов.

9 голосов
/ 25 ноября 2010
lambda {|a,b| a+ b}

Создает лямбду, которая принимает два аргумента и возвращает результат вызова + первого, со вторым аргументом.

lambda {add}

Создает лямбду, которая не принимает аргументов и вызывает add без аргументов, что, конечно, ошибка.

Чтобы делать то, что вы хотите, вы должны сделать

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

или

plus = method(:add).to_proc
4 голосов
/ 25 ноября 2010

Когда вы пишете lambda {add}, вы объявляете Proc, который не принимает аргументов, и в качестве единственного действия вызывает add без аргументов.Это не превращает add в Проц.С другой стороны, lambda {|a,b| a + b} возвращает Proc, который принимает два аргумента и складывает их вместе - поскольку он принимает аргументы, допустимо передавать аргументы этому.

Я думаю, что вам нужно method(:add).to_proc.curry.

...