5

在将一些代码迁移到最新版本的 F#(包含在 VS2010 b1 中)时,我遇到了一个问题,我想知道是否有可用的解决方法以及 - 如果没有 - 为什么 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 参数。考虑重新设计这些成员以采用元组形式的参数

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

4

1 回答 1

7

更改的原因在详细的发行说明中

Curried 方法的优化

咖喱成员如下所示:

类型 C() =

static member Sum a b = a + b    

在以前的 F# 实现中,curried 成员的编译效率低于非 curried 成员。现在已经改变了。但是,现在对 curried 成员的定义有一些小的限制:

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

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

    [<OverloadID("CurriedAbc")>]
    member public x.Abc (p:(oneType * anotherType) seq)
       = fun otherParm -> method impl...
于 2009-05-28T13:03:48.910 回答