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
DDDoriginal
2024-11-08 17:22:021057parcourir

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
}

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!

Déclaration:
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