F#:curried overload / tupled overload问题

时间:2009-05-28 12:25:09

标签: visual-studio-2010 f# currying

在将某些代码迁移到VS2010 b1中包含的最新版本的F#时,我遇到了一个问题,我想知道是否有可用的解决方法,如果没有,为什么F#编译器的行为修改为不支持该方案。


type Foo(a) =
    [<OverloadID("CurriedAbc")>]
    member public x.Abc (p:(oneType * anotherType) seq) otherParm = method impl...

    //this overload exists for better compatibility with other languages
    [<OverloadID("TupledAbc")>]
    member public x.Abc (p:Dictionary<oneType, anotherType>, otherParm) =
        x.Abc(p |> Seq.map(fun kvp -> (kvp.Key, kvp.Value))) otherParm

此代码产生以下编译时错误:

错误FS0191:此方法的一个或多个重载具有curried参数。考虑重新设计这些成员以采用tupled形式的参数

请注意,这曾经在F#1.9.6.2(9月CTP)上完美运作

1 个答案:

答案 0 :(得分:7)

更改的原因在于detailed release notes

  

咖喱方法的优化

     

一个咖喱成员看起来像这样:

     

输入C()=

static member Sum a b = a + b    
     

在F#的先前实现中   咖喱成员的编制较少   比非咖喱成员有效。   现在已经改变了。然而,   现在有一些小的限制   关于咖喱成员的定义:

     
      
  • 咖喱成员可能不会超载
  •   
  • 可能需要调整一些咖喱成员的定义,以便在定义中添加正确数量的参数
  •   

由于您的重载只能在第一个参数上解决,因此您应该可以通过将curried版本更改为:

来解决它
    [<OverloadID("CurriedAbc")>]
    member public x.Abc (p:(oneType * anotherType) seq)
       = fun otherParm -> method impl...