5

一部のコードを 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: このメソッドの 1 つ以上のオーバーロードにカリー化された引数があります。タプル形式で引数を取るようにこれらのメンバーを再設計することを検討してください

これは F# 1.9.6.2 (9 月 CTP) で問題なく動作していたことに注意してください。

4

1 に答える 1

7

変更の理由は、詳細なリリース ノートにあります。

カリー化されたメソッドの最適化

カリー化されたメンバーは次のようになります。

タイプ C() =

static member Sum a b = a + b    

F# の以前の実装では、カリー化されたメンバーは、カリー化されていないメンバーよりも効率的にコンパイルされませんでした。これは変更されました。ただし、カリー化されたメンバーの定義にはいくつかの小さな制限があります。

  • カリー化されたメンバーはオーバーロードできません
  • カリー化されたメンバーの一部の定義は、正しい数のパラメーターを定義に追加するために調整する必要がある場合があります。

オーバーロードは最初のパラメーターでのみ解決できるため、カリー化されたバージョンを次のように変更することで回避できるはずです。

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