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