Curry in Go : une explication complète
Question :
Dans les langages de programmation fonctionnels comme Haskell, il est possible de "curry" une fonction, lui permettant d'être partiellement appliquée et de renvoyer une autre fonction qui prend les arguments restants. Comment cela peut-il être réalisé dans Go ?
Réponse :
Application partielle dans Go
Go ne prend pas nativement en charge les applications partielles application. Cependant, vous pouvez obtenir un effet similaire en utilisant des fermetures :
import "fmt" func mkAdd(a int) func(b int) int { return func(b int) int { return a + b } } func main() { add2 := mkAdd(2) // Creates a function that adds 2 to its argument fmt.Println(add2(5)) // Prints 7 }
Fonction Currying dans Go
Dans Go, le currying peut être obtenu en utilisant des fermetures qui acceptent plusieurs arguments et renvoie une nouvelle fonction.
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)) // Prints 10 fmt.Println(add3(6)) // Prints 9 }
Limitations :
La fonction mkAdd dans l'exemple ci-dessus ne peut être appliquée que partiellement depuis la gauche (c'est-à-dire le premier argument) . Pour prendre en charge une application partielle arbitraire, vous pouvez utiliser l'approche suivante :
type Curry func(args ...int) func(args ...int) int func (c Curry) Apply(args ...int) int { return c(args...) } func mkAdd(a int) Curry { return func(args ...int) func(args ...int) int { return func(moreArgs ...int) int { return a + append(args, moreArgs...)... } } } func main() { add2 := mkAdd(2).Apply(5, 3) // Partially apply 2 arguments fmt.Println(add2.Apply(6)) // Apply the remaining argument }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!