Ho bisogno di alcuni esempi di implementazione della funzione curry in ruby (1.8.6 o 1.8.7 non 1.9).come implementare curry (funzione parziale) in rubino
5
A
risposta
5
Quindi, ecco come fare currying con blocchi, piuttosto che metodi:
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
e funziona abbastanza bene nella pratica. Gli argomenti possono essere al curry o no, e argomenti extra vengono raccolti come al solito:
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
ho preso la decisione di progettazione di avere no-arg blocchi restituiscono un valore immediato sulla currying:
irb> curry { 3 }
#=> 3
irb> curry { |*xs| xs }
#=> []
Questo è necessario evitare di dover terminare ogni volta con un []
(ed è abbastanza simile a Haskell).
3
Forse questo può aiutare: http://asemanfar.com/Currying-in-Ruby. Ha il codice sorgente per un modulo Curriable.
Problemi correlati
- 1. Perché la funzione curry è chiamata curry?
- 2. curry funzione anonima in SML
- 3. Come può andare-lang curry?
- 4. Flex: implementazione della classica funzione curry in ActionScript?
- 5. Come posso creare una funzione anonima al curry in scala?
- 6. Come eseguire il curry di una funzione in Scala
- 7. Come funziona l'applicazione di funzione con l'operatore $ curry in Haskell?
- 8. Come funziona curry (==)?
- 9. come curry un metodo?
- 10. Funzione C++ associare argomenti ripetuti alla funzione al curry
- 11. Scala: passa la funzione al curry come parametro
- 12. Come implementare la funzione GROWTH in JavaScript
- 13. Come implementare questa funzione in Haskell
- 14. Scala: costruttori curry
- 15. Perchè Scala richiede l'applicazione parziale delle funzioni al curry quando si assegna a una val?
- 16. Convertire funzione parziale al metodo in python
- 17. Mantenimento parziale della funzione generica
- 18. Quali sono i casi di utilizzo reale del curry?
- 19. Come si crea una funzione parziale con generici in scala?
- 20. Estensione di una funzione parziale parzialmente implementata in scala
- 21. Posso curry questo meglio?
- 22. Come curry a ... argomento per posizione in R?
- 23. Come implementare lambda come una funzione chiamata "lambda" in Clojure?
- 24. NSArray. Come posso implementare la funzione Mappa?
- 25. Come trasformare e applicare una funzione parziale usando Scala Macro?
- 26. Come squish in rubino
- 27. È possibile implementare addressof() come funzione constexpr?
- 28. Implementare il sovraccarico della funzione in Haskell
- 29. JavaScript supporta l'applicazione di funzione parziale?
- 30. Perché init è una funzione parziale?