Go 中的柯里化:全面解释
问题:
在函数式编程语言中,例如Haskell,可以“柯里化”一个函数,允许它被部分应用并返回另一个接受剩余参数的函数。在 Go 中如何实现这一点?
答案:
Go 中的 Partial 应用
Go 原生不支持 Partial应用。但是,您可以使用闭包实现类似的效果:
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 }
Go 中的函数柯里化
在 Go 中,可以使用接受多个参数的闭包来实现柯里化,并且返回一个新函数。
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 }
限制:
上例中的函数 mkAdd 只能从左侧部分应用(即第一个参数) 。要支持任意部分应用,可以使用以下方法:
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 }
以上是如何在 Go 中实现函数式编程的“柯里化”?的详细内容。更多信息请关注PHP中文网其他相关文章!