Maison > développement back-end > Golang > Comment réaliser le « curry » de la programmation fonctionnelle dans Go ?

Comment réaliser le « curry » de la programmation fonctionnelle dans Go ?

DDD
Libérer: 2024-11-08 17:22:02
original
1048 Les gens l'ont consulté

How can you achieve functional programming's

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
}
Copier après la connexion

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
}
Copier après la connexion

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
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal