Heim > Backend-Entwicklung > Golang > Wie kann man in Go das „Currying' der funktionalen Programmierung erreichen?

Wie kann man in Go das „Currying' der funktionalen Programmierung erreichen?

DDD
Freigeben: 2024-11-08 17:22:02
Original
1049 Leute haben es durchsucht

How can you achieve functional programming's

Curry in Go: Eine umfassende Erklärung

Frage:

In funktionalen Programmiersprachen wie Haskell ist es möglich, eine Funktion zu „curry“, sodass sie teilweise angewendet werden kann und eine andere Funktion zurückgibt, die die verbleibenden Argumente übernimmt. Wie kann dies in Go erreicht werden?

Antwort:

Teilweise Anwendung in Go

Go unterstützt Teilweise nicht nativ Anwendung. Sie können jedoch einen ähnlichen Effekt mithilfe von Abschlüssen erzielen:

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
}
Nach dem Login kopieren

Funktion Currying in Go

In Go kann Currying mithilfe von Abschlüssen erreicht werden, die mehrere Argumente akzeptieren und Gibt eine neue Funktion zurück.

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
}
Nach dem Login kopieren

Einschränkungen:

Die Funktion mkAdd im obigen Beispiel kann nur teilweise von links (d. h. dem ersten Argument) angewendet werden. . Um eine beliebige Teilanwendung zu unterstützen, können Sie den folgenden Ansatz verwenden:

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
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann man in Go das „Currying' der funktionalen Programmierung erreichen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage