>백엔드 개발 >Golang >Go에서 함수형 프로그래밍의 '커링'을 어떻게 달성할 수 있나요?

Go에서 함수형 프로그래밍의 '커링'을 어떻게 달성할 수 있나요?

DDD
DDD원래의
2024-11-08 17:22:021036검색

How can you achieve functional programming's

Curry in Go: 종합적인 설명

질문:

다음과 같은 함수형 프로그래밍 언어에서 Haskell에서는 함수를 "커리"하여 부분적으로 적용하고 나머지 인수를 취하는 다른 함수를 반환하는 것이 가능합니다. Go에서 어떻게 이를 달성할 수 있나요?

답변:

Go의 부분 애플리케이션

Go는 기본적으로 부분을 지원하지 않습니다. 애플리케이션. 그러나 클로저를 사용하면 비슷한 효과를 얻을 수 있습니다.

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에서 Currying 함수

Go에서는 여러 인수를 허용하는 클로저를 사용하여 currying을 수행할 수 있습니다. 새 함수를 반환합니다.

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으로 문의하세요.