J'ai besoin de quelques exemples de la mise en œuvre de la fonction curry dans ruby (1.8.6 ou 1.8.7 pas 1.9).comment mettre en œuvre curry (fonction partielle) en ruby
5
A
Répondre
5
est donc ici comment faire taitement avec des blocs, plutôt que des méthodes:
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
et il fonctionne assez bien dans la pratique. Les arguments peuvent être cari ou non, et arguments supplémentaires sont collectés comme d'habitude:
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
je pris la décision de conception de ne pas avoir-arg blocs retournent une valeur immédiate sur Currying:
irb> curry { 3 }
#=> 3
irb> curry { |*xs| xs }
#=> []
C'est nécessaire pour éviter d'avoir à finir avec curry []
à chaque fois (et est assez similaire à Haskell).
3
Peut-être que cela peut aider: http://asemanfar.com/Currying-in-Ruby. Il a le code source pour un module Curriable.
Questions connexes
- 1. F # fonction au curry
- 2. Comment mettre en œuvre le masquage d'image
- 3. Comment mettre en œuvre l10n Android?
- 4. Struts2 Tuiles - comment mettre en œuvre?
- 5. $ (document) .ready en vue partielle Ruby
- 6. mettre en œuvre webservice RESTFUL avec php
- 7. Comment puis-je mettre en œuvre cette plus efficace
- 8. Mettre en œuvre l'avenir dans CLDC 1.1
- 9. mettre en œuvre webcache comme application Web
- 10. C#: Comment mettre en œuvre IOrderedEnumerable <T>
- 11. Contient <T>() et comment le mettre en œuvre
- 12. ASP.Net: Comment mettre en œuvre correctement ce flux d'authentification
- 13. iPhone UITableView "Plus" Cellule? Comment mettre en œuvre?
- 14. Comment allez-vous mettre en œuvre la règle hors-jeu?
- 15. comment mettre en œuvre miroir de page Web avec jQuery?
- 16. Comment mettre en œuvre une requête avec IQueryable dans SilverLight
- 17. comment mettre en œuvre jquery oop dans le site réel
- 18. Comment mettre en œuvre CreatedAt Propriété avec Castle ActiveRecord
- 19. Comment mettre en œuvre une boucle do-while dans tsql
- 20. Mettre en œuvre une différence symétrique dans SQL Server?
- 21. mise en œuvre de la fonction RONDE Excel
- 22. Je veux mettre en œuvre l'événement flip touch dans l'iPhone
- 23. Comment mettre en œuvre une minuterie asynchrone sur un système * nix en utilisant pthreads
- 24. Mettre en œuvre la fonction de schéma SMS dans les applications iPhone
- 25. mettre en œuvre des interfaces après le fait
- 26. Mise en œuvre du protocole Bittorrent
- 27. zoom sur mesure pour mettre en œuvre un UIScrollView
- 28. Nécessité de mettre en œuvre unix suivante chose
- 29. Mettre en œuvre le critère MAP de Velicer
- 30. Aidez-moi mettre en œuvre un tampon rembobinable