2013-09-12 11 views
0

Я пытаюсь реализовать currying согласно примеру Little Schemer eq? ниже. eq(test, testFor) принимает условие теста и атом и возвращает функцию, основанную на переданной функции test, которая принимает один аргумент, чтобы возвращать логическое значение.Пример маленького шаблона Curry в Ruby

Вот мой код:

def eq(test, s) 
    Proc.new { |x| test(s,x)} 
end 

eqToCarrot = eq(Proc.new{|x,y| x==y},"carrot") 

if eqToCarrot.call("carrot") 
    puts "Equal!" 
end 

Условный условие не выполняется. Может кто-нибудь сказать мне, почему?

ответ

2

Чтобы позвонить test в пределах вашего eq method, вам необходимо использовать test.call вместо test.

Как есть причина, вы не получаете Undefined method или другую ошибку из вашего выражения test(..) в eq является то, что существует метод Kernel имени test, который принимает 2 или 3 параметра.

Чтобы ответить на вопрос в своем комментарии о том, как вернуть proc, который возвращает proc, вы «просто сделаете это». Например, вы можете вернуть Proc.new {Proc.new {puts 'foo'}}.

И поскольку переменные proc могут передаваться и возвращаться как любая другая переменная, не заботясь о том, что они случайно «вызывают», если вы передаете переменную proc в качестве аргумента, вы можете просто вернуть эту переменную, как в Proc.new {|proc| proc}.

В вашем случае, хотя, если вы пытаетесь создать предикат на основе переданного аргумента, вы можете сделать следующее:

def make_eq_proc(match_string) 
    Proc.new {|arg_string| arg_string == match_string} 
end 

eq_carrot = make_eq_proc('carrot') 

eq_carrot.call('carrot') # => true 
+0

так как же функция возвращает процедурный, который возвращает процедурный ? –

+0

Я не могу ответить сейчас, но если никто больше не вернется к вам, я отвечу через пару часов. –

+0

@AmanGupta См. Обновленный ответ –