7

たとえば、F# でモジュールを作成したとします。

module Lib

type A =
    member this.x1 x = ...

let helpa x = ...
let helpb x = ...

type B =
    member this.y1 x = ...

let helpc x = ...

typeA with
    member this.x2 x = ...
typeB with
    member this.y2 x = ...

F# では でうまく動作しますopen Libが、C# で使用したい場合 ( . モジュール名を省略する方法がないのはかなり面倒です。のような静的メソッドを呼び出すのはさらに面倒です。Libnew Lib.A(...)Lib.A.C()

次に、いくつかのヘルパー関数を導入するたびに、新しい名前で新しいモジュールを作成する必要がありますmodulenamespace場合によっては、すべてのヘルパー関数を 1 つのモジュールに再配置することもできますが、コードが読みにくくなります。

これにはどのような構造が適しているでしょうか。

私が持っていたらいいのに:Using * = Lib.*C#用。

4

2 に答える 2

7

ここでは、F#はC#よりも柔軟性が高いため、標準的な方法でC#に公開します。つまり、名前空間で型を囲みます。このようなものは、私が思うに、両方の長所を提供します。

namespace Lib

type A =
    member this.x1 x = ()

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module A =
  let helpa x = ()
  let helpb x = ()

type B =
    member this.y1 x = ()

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module B =
  let helpb x = ()

type A with
    member this.x2 x = ()
type B with
    member this.y2 x = ()

F#コレクションも同様の設計に従います。[<AutoOpen>]および[<RequireQualifiedAccess>]属性を使用して、F#からモジュールの使用方法をさらに制御できます。

于 2013-01-22T17:02:03.733 に答える
4

あなたはすでにあなたの答えの中で最良のオプションについて言及したと思います-namespace上部に宣言を付けてファイルを定義し(このように、using LibC#で書くことができます)、次にすべてのヘルパー関数をモジュールに配置します。

あるタイプ(たとえば、)に明確に関連付けられているヘルパー関数は、(タイプに関連付けられているモジュールのF#関数と同様にA)という名前のモジュールに配置できます。AListList<'T>

モジュールに特別な属性をマークする必要があるため(名前の衝突を避けるため)、これは少し手間がかかりますが、F#とC#の両方から簡単に使用できます(そして、保存するよりもうまく使用することが重要だと思いますライブラリを構築する際のいくつかのキーストローク):

namespace Lib

// Declaration of the 'A' type and helper functions in 'A' module 
type A() =
  member this.x1 x = 10

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module A = 
  let helpa (x:A) = x.x1
  let helpb (x:A) = x.x1

// Declaration of the 'B' type and helper functions in 'B' module 
type B() =
  member this.y1 x = 10

[<CompilationRepresentation(CompilationRepresentationFlags.ModuleSuffix)>]
module B = 
  let helpc (x:B) = x.y1

// Member augmentations for easy use from C#
type A with
    member this.x2 x = A.helpa this
type B with
    member this.y2 x = B.helpc this
于 2013-01-22T17:02:18.137 に答える