Necesito algunos ejemplos de implementación de la función de curry en ruby (1.8.6 o 1.8.7 no 1.9).cómo implementar curry (función parcial) en ruby
5
A
Respuesta
5
Así que aquí es cómo hacer currying con bloques, en lugar de los métodos:
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
y funciona bastante bien en la práctica. Los argumentos pueden ser al curry o no, y argumentos extra se recogen como de costumbre:
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
he tomado la decisión de diseño que no tiene Arg bloques devuelven un valor inmediato en Currying:
irb> curry { 3 }
#=> 3
irb> curry { |*xs| xs }
#=> []
Este es necesario para evitar tener que terminar el currying con un []
todo el tiempo (y es bastante similar a Haskell).
3
Tal vez esto puede ayudar: http://asemanfar.com/Currying-in-Ruby. Tiene un código fuente para un módulo Curry.
Cuestiones relacionadas
- 1. variadic curry función suma
- 2. Cómo curry una función en Scala
- 3. función de curry JavaScript
- 4. al curry función anónima en SML
- 5. Abusar genéricos para implementar una función de composición al curry en Java
- 6. Cómo curry una función w.r.t. sus argumentos opcionales en OCaml
- 7. ¿Cómo puedo crear la función anónima curry en scala?
- 8. Cosas raras con función al curry
- 9. Flex: implementando la función clásica de curry en actionscript?
- 10. ¿Cuándo una función parcial scala no es una función parcial?
- 11. ¿Cómo implementar una clase abstracta en ruby?
- 12. Cómo implementar cookies en Ruby Net :: HTTP
- 13. ¿Cómo implementar un enumerador en Ruby?
- 14. ¿Es posible en F # curry un argumento de función central?
- 15. JavaScript curry: ¿cuáles son las aplicaciones prácticas?
- 16. Isomorfismo de Curry-Howard
- 17. ¿Cómo implementar la función recordarme?
- 18. ¿Aplicación parcial con un C++ lambda?
- 19. Diferencia entre tipos curry similares en Scala
- 20. Cómo implementar esta función en Haskell
- 21. Scala: constructores curry
- 22. Evaluación de función parcial en MATLAB
- 23. ¿Cómo obtener el dominio de una función parcial en Scala?
- 24. ¿Cómo creo una función parcial con genéricos en scala?
- 25. curry function preguntas relacionadas en Scala
- 26. Renderizar parcial en controlador usando Ruby On Rails
- 27. ¿Es posible curry al revés en Scala?
- 28. ¿Admite JavaScript la aplicación de función parcial?
- 29. Problemas con la función de clase parcial anula en C++
- 30. Cómo curry a ... argumento por posición en R?