2011-03-18 72 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))