Ruby中的Little Schemer Curry示例

时间:2013-09-12 18:00:27

标签: ruby proc the-little-schemer

我正在尝试按照下面给出的Little Schemer示例eq?实现currying。 eq( test, testFor)接受测试条件和一个原子,并根据传递的函数test返回一个函数,它接受一个参数返回一个布尔值。

这是我的代码:

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

不执行if条件。有人可以告诉我为什么吗?

1 个答案:

答案 0 :(得分:2)

要在test内拨打eq method,您需要使用test.call而非test

原样,您在Undefined method中的test(..)表达式中没有收到eq或其他错误的原因是有一个名为test的内核方法接受2或3个参数。

要回答你的评论中关于如何返回一个返回proc的proc的问题,你“只是去做”。例如,您可以返回Proc.new {Proc.new {puts 'foo'}}

由于proc变量可以像任何其他变量一样传递和返回,而不用担心它们被意外“调用”,如果你传入proc变量作为参数,你可以简单地返回该变量,如{{1 }}

但是,在您的情况下,如果您尝试根据传入的参数创建谓词,则可以执行以下操作:

Proc.new {|proc| proc}