我需要一些在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. 部分應用/咖喱函數vs重載函數
- 3. 咖喱匿名函數
- 4. 關聯列表中的部分咖喱函數(地圖)
- 5. 這兩個咖喱函數實現是否相等?
- 6. swift中的咖喱函數語法
- 7. Scala的部分應用咖喱功能
- 8. 無法導出咖喱通用函數
- 9. 咖喱普遍量化函數
- 10. 在Ramda的流量分型咖喱函數定義
- 11. 如何啓用咖喱功能繼承,然後部分應用
- 12. 如何通過一個參數來咖喱函數
- 13. 咖喱和空參數
- 14. 如何在斯卡拉咖喱功能
- 15. AWK咖喱函數 - 函數可以返回一個函數嗎?
- 16. 如何理解咖喱的函數定義/ uncurry
- 17. 使用FunctionX#咖喱
- 18. SML咖喱問題
- 19. JavaScript的咖喱/schönfinkeln
- 20. Swift3中的咖喱關閉?
- 21. 是否可以在Livescript中定義提升的咖喱函數?
- 22. 執行n次函數的咖喱函數
- 23. Uncurry n個參數的函數咖喱在javascript
- 24. RamdaJS庫咖喱語法分解
- 25. 在斯卡拉如何咖喱現有的函數與單個參數並傳遞給更高階的函數?
- 26. 如何在打字稿中寫入咖喱函數的類型簽名
- 27. 如何使用咖喱功能
- 28. 如何咖喱一種方法?
- 29. 咖喱功能應該如何工作?
- 30. 如何使用適用於咖喱?