我需要一些在ruby中实现curry函数的例子(1.8.6或1.8.7而不是1.9)。如何在ruby中实现咖喱(部分函数)
5
A
回答
5
因此,这里是如何做到与块讨好,而不是方法:
def curry(&block)
arity = (block.arity >= 0) ? block.arity : -(block.arity + 1)
# return an immediate value if the block has one
return block[] if arity == 0
# otherwise, curry it argument by argument
args = []
innermost = lambda do |last,*extra|
args[arity-1] = last
block[*(args+extra)]
end
(0...(arity-1)).to_a.reverse.inject(innermost) do |inner,i|
lambda do |arg_i,*extra|
args[i] = arg_i
# pass extra arguments on to inner calls
if extra.empty?
inner
else
inner[*extra]
end
end
end
end
和它的作品相当不错的做法。参数可以令行禁止与否,和 额外的参数收集和往常一样:
irb> (curry { |x,y| x + y })[1,2]
#=> 3
irb> (curry { |x,y| x + y })[1][2]
#=> 3
irb> (curry { |x,*ys| ys << x })[1]
#=> [1]
irb> (curry { |x,*ys| ys << x })[1,2,3]
#=> [2, 3, 1]
irb> (curry { |x,y,*zs| zs << (x+y) })[1,2]
#=> [3]
irb> (curry { |x,y,*zs| zs << (x+y) })[1,2,4]
#=> [4, 3]
irb> (curry { |x,y,*zs| zs << (x+y) })[1][2]
#=> [3]
irb> (curry { |x,y,*zs| zs << (x+y) })[1][2,4]
#=> [4, 3]
irb> (curry { |a,b,c,d,e| a+b+c+d+e })[1,2,3,4,5]
#=> 15
irb> (curry { |a,b,c,d,e| a+b+c+d+e })[1][2][3][4][5]
#=> 15
irb> (curry { |a,b,c,d,e| a+b+c+d+e })[1,2][3][4][5]
#=> 15
irb> (curry { |a,b,c,d,e| a+b+c+d+e })[1][2,3,4][5]
#=> 15
我做出的设计决策具有无参数块上钻营返回一个立即值:
irb> curry { 3 }
#=> 3
irb> curry { |*xs| xs }
#=> []
这是这是避免每次都必须结束与一个[]
(并且相当像Haskell一样)的必要条件。
3
也许可以帮到您:http://asemanfar.com/Currying-in-Ruby。它有一个模块的源代码Curriable。
相关问题
- 1. 实现咖喱功能
- 2. 关联列表中的部分咖喱函数(地图)
- 3. Scala的部分应用咖喱功能
- 4. 无法导出咖喱通用函数
- 5. 咖喱普遍量化函数
- 6. 在Ramda的流量分型咖喱函数定义
- 7. 如何启用咖喱功能继承,然后部分应用
- 8. 如何通过一个参数来咖喱函数
- 9. 如何在斯卡拉咖喱功能
- 10. 如何理解咖喱的函数定义/ uncurry
- 11. SML咖喱问题
- 12. JavaScript的咖喱/schönfinkeln
- 13. Swift3中的咖喱关闭?
- 14. 执行n次函数的咖喱函数
- 15. Uncurry n个参数的函数咖喱在javascript
- 16. RamdaJS库咖喱语法分解
- 17. 如何使用适用于咖喱?
- 18. 如何使用咖喱功能
- 19. 咖喱功能:如何优化它们
- 20. Elixir中是否有标准的咖喱()函数?
- 21. 咖喱函数类型中圆括号的区别
- 22. 如何在子类中实现部分函数
- 23. 问题上咖喱功能
- 24. 斯卡拉咖喱例
- 25. 斯卡拉咖喱功能
- 26. 的JavaScript功能咖喱
- 27. uncurry和咖喱的功能
- 28. Django的咖喱错误
- 29. CPS以咖喱语言
- 30. 可变参数咖喱和功能