2011-03-18 25 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

它確實看起來像一個bug。你的最後一個成員試圖調用第二個成員,儘管它應該調用第一個成員。我是否也錯過了一些觀點? – fjdumont 2011-03-18 13:09:20

+0

我認爲這很重要,但我很好奇你爲什麼想要這樣做。 – Daniel 2011-03-18 14:23:43

+0

我不知道。這是我第二次發現這個「錯誤」,同時編碼相互調用的重載函數。我發佈的代碼只是一個簡單的例子,僅僅反映了「bug」。在真實世界的情況下,它有時候會發生一個函數,它用一個參數來做某事,但如果你提供了2,那麼它會和第一個參數一樣,而另一些則可能與第二個參數更具體,等等。 – Peter 2011-03-18 14:44:49

回答

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))