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中,可以使用接受多個參數的閉包來實現柯里化,並且傳回一個新的function.
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中文網其他相關文章!