functional programming - ¿Cómo puede el curry go-lang?
functional-programming currying (3)
Para ampliar la respuesta anterior, que le permite tomar un número arbitrario de argumentos:
package main
import (
"fmt"
)
func mkAdd(a int) func(...int) int {
return func(b... int) int {
for _, i := range b {
a += i
}
return a
}
}
func main() {
add2 := mkAdd(2)
add3 := mkAdd(3)
fmt.Println(add2(5,3), add3(6))
}
En la programación funcional me gusta Haskell, puedo definir la función.
add a b = a+b
Luego, add 3
devolverá una función que toma un parámetro y devolverá 3 + something
¿Cómo puedo hacer esto en GO?
Cuando defino una función que toma más de un parámetro (digamos n), ¿puedo darle un solo parámetro y obtener otra función que tome los parámetros n-1?
Actualización :
Lo siento por las palabras imprecisas en mi pregunta original.
Creo que mi pregunta debería ser hecha como dos preguntas:
- ¿Hay aplicación parcial en GO?
- ¿Cómo funciona la función de curry?
Gracias TheOnly92 y Alex por resolver mi segunda pregunta. Sin embargo, también tengo curiosidad por la primera pregunta.
Puede llevarlo un paso más allá definiendo un tipo de función y luego agregándole un método.
package main
import "fmt"
type Add func(int, int) int
func (f Add) Apply(i int) func(int) int {
return func(j int) int {
return f(i, j)
}
}
func main() {
var add Add = func(i, j int) int { return i + j }
add3 := add.Apply(3)
fmt.Println("add 3 to 2:", add3(2))
}
Incluso puedes probar con varias funciones:
package main
import "fmt"
type Multiply func(...int) int
func (f Multiply) Apply(i int) func(...int) int {
return func(values ...int) int {
values = append([]int{i}, values...)
return f(values...)
}
}
func main() {
var multiply Multiply = func(values ...int) int {
var total int = 1
for _, value := range values {
total *= value
}
return total
}
var times2 Multiply = multiply.Apply(2)
fmt.Println("times 2:", times2(3, 4), "(expect 24)")
// ... and you can even cascade (if assigned the Multiply type)
times6 := times2.Apply(3)
fmt.Println("times 6:", times6(2, 3, 5, 10), "(expect 1800)")
}
¡Espero que esto ayude!
Tal vez algo como
package main
import (
"fmt"
)
func mkAdd(a int) func(int) int {
return func(b int) int {
return a + b
}
}
func main() {
add2 := mkAdd(2)
add3 := mkAdd(3)
fmt.Println(add2(5), add3(6))
}