functional-programming go currying partial-application

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)) }