Potrzebuję przykładów implementacji funkcji curry w ruby (1.8.6 lub 1.8.7 nie 1.9).jak zaimplementować curry (funkcja częściowa) w rubinach
5
A
Odpowiedz
5
Więc oto jak to zrobić currying z bloków, zamiast metod:
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
I działa dość dobrze w praktyce. Argumenty mogą być curry, czy nie, i dodatkowe argumenty są zbierane jak zwykle:
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
podjąłem decyzję projekt się nie mieć Arg blokuje powrót natychmiastową wartość na currying:
irb> curry { 3 }
#=> 3
irb> curry { |*xs| xs }
#=> []
Jest konieczne, aby nie musieć za każdym razem kończyć curlingu za pomocą []
(i jest dość podobny do Haskella).
3
Może to pomoże: http://asemanfar.com/Currying-in-Ruby. Ma kod źródłowy dla modułu Curriable.
Powiązane problemy
- 1. Jak curry funkcja w Scala
- 2. Jak mogę sprawdzić, czy funkcja jest częściowa?
- 3. Jak działa funkcja z curry $ operator w Haskell?
- 4. C++ szablon częściowa specjalizacja członek funkcja
- 5. Jak działa curry (==)?
- 6. jak curry metodę?
- 7. Częściowa notacja w Haskell
- 8. Arytmetyka w rubinach
- 9. C++ Funkcja wiążą powtarzające się argumenty dla funkcji curry
- 10. Jak piszesz literał binarny w rubinach?
- 11. Kiedy funkcja częściowa scala nie jest funkcją częściową?
- 12. socket.io i eventmachine w rubinach
- 13. Wzorzec projektu międzyfazowy w rubinach
- 14. var_dump i umrze jak php, w rubinach na szynach (debugowanie w rubinach na szynach)
- 15. Jak zaimplementować funkcjonalność taką jak funkcja "Nowa historia" Facebooka?
- 16. Algorytmy uczenia maszynowego w rubinach
- 17. drzewa wyszukiwania binarnego w rubinach
- 18. Sprawdzanie długości postaci w rubinach
- 19. Czy curry jest takie samo jak przeciążenie?
- 20. Częściowa ocena funkcji w MATLAB
- 21. Mieszanie dopasowywania wzorców i curry w OCaml
- 22. Częściowa lista katalogów
- 23. Jakie są korzyści z curry?
- 24. JSF i częściowa walidacja
- 25. Częściowa aktualizacja RecyclerView.ViewHolder
- 26. XMLHttpRequest 206 Częściowa zawartość
- 27. Częściowa rendering nie pokazano
- 28. Czy curry jest sposobem na uniknięcie dziedziczenia?
- 29. Najprostszy kod do sortowania tablic w rubinach?
- 30. Częściowa klasa dla kontrolera