Haskell과 같은 다양한 프로그래밍 언어에서 fmap은 데이터 구조의 유형을 유지하면서 함수를 적용하는 데 유용한 도구입니다. 그러나 Go에서 fmap과 직접적으로 동등한 것을 구현하는 것은 메소드 기반 제네릭으로 인해 독특한 과제를 제시합니다. 질문이 생깁니다: 유형 안전성을 손상시키지 않고 어떻게 Go에서 fmap 기능을 에뮬레이트할 수 있습니까?
Go Generics의 제한
불행히도 Go의 현재 제네릭 시스템은 적합하지 않습니다. 메소드를 통해 fmap을 직접 에뮬레이션합니다. 메소드 매개변수는 새로운 유형 매개변수를 도입할 수 없으므로 질문에 언급된 유형 불일치 오류가 발생합니다.
대체 접근 방식
유사한 메소드 접근 방식을 사용하고 싶은 유혹이 있을 수 있습니다. Haskell에서는 다음 고려 사항이 더 바람직한 대안으로 이어집니다.
구현 최상위 함수로서의 fmap
Go에서 fmap을 에뮬레이션하는 권장 방법은 fmap을 다음과 같이 정의하는 것입니다. 모든 유형 이외의 최상위 기능. 예는 다음과 같습니다.
package main import "fmt" type S[A any] struct { contents A } func Fmap[A, B any](sa S[A], f func(A) B) S[B] { return S[B]{contents: f(sa.contents)} } func main() { ss := S[string]{"foo"} f := func(s string) int { return len(s) } fmt.Println(Fmap(ss, f)) // {3} }
이 접근 방식은 유형 안전성과 가독성을 유지하면서 Go의 메서드 기반 제네릭에 더 잘 맞습니다.
결론
하지만 다른 언어의 개념을 Go로 직접 번역하는 것이 매력적일 수 있으므로 Go의 고유한 한계를 고려하는 것이 중요합니다. 언어. fmap을 에뮬레이트하기 위해 보다 관용적인 Go 기반 접근 방식을 수용함으로써 Go의 디자인 원칙을 준수하면서 원하는 기능을 달성할 수 있습니다.
위 내용은 유형 안전성을 유지하면서 Go에서 fmap 기능을 어떻게 에뮬레이트할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!