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 중국어 웹사이트의 기타 관련 기사를 참조하세요!