首頁  >  文章  >  後端開發  >  如何在 Go 中實現函數式程式設計的「柯里化」?

如何在 Go 中實現函數式程式設計的「柯里化」?

DDD
DDD原創
2024-11-08 17:22:02959瀏覽

How can you achieve functional programming's

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn