2011-03-18 4 views
2

왜 이렇게 코드가 컴파일되지 않습니까?F #의 오버로드 된 메서드에 문제가 발생했습니다

type MyType() = 
    static member myMember (f,(g,h)) = g 
    static member myMember (a,(b,c,d)) = MyType.myMember(a,(b,c)) 
    static member myMember (a,(b,c,d,e)) = MyType.myMember(a,(b,c)) 

는 말한다 : ... 튜플은 한 2의 길이와 4

그것은 버그가 서로 다른?

+1

실제로 버그가있는 것 같습니다. 마지막 멤버는 첫 번째 멤버를 호출해야하지만 두 번째 멤버를 호출하려고합니다. 나는 어떤 점도 놓치고 있는가? – fjdumont

+0

요점을 말하지만, 왜 이렇게하고 싶은지 궁금합니다. – Daniel

+0

나는 그렇지 않습니다. 서로를 호출하는 오버로드 된 함수를 코딩하는 동안이 "버그"를 발견 한 것은 두 번째입니다. 필자가 발표 한 코드는 "버그"를 반영한 ​​단순화 된 예제입니다. 실제 상황에서는 하나의 매개 변수로 무언가를하는 함수를 정의하는 경우가 있지만, 2를 제공하면 하나의 함수와 같고 다른 함수는 두 번째 함수와 더 구체적 일 수 있습니다. – Peter

답변

3

버그인지 모르겠지만 일반적으로 여러 가지 과부하가있는 유형 유추는 잘 수행하기가 어렵습니다. 가장 좋은 방법은 일부 유형 특수 효과를 추가하는 것입니다.

type MyType() = 
    static member myMember<'a,'b,'c> (f:'a,(g:'b,h:'c)) = g 
    static member myMember (a,(b,c,d)) = MyType.myMember<_,_,_>(a,(b,c)) 
    static member myMember (a,(b,c,d,e)) = MyType.myMember<_,_,_>(a,(b,c)) 
관련 문제