2
let ``one`` x = One(x)
type Number = 
| One of int
| Two
with 
    member this.Hi x = ``one`` x

基本的に、識別された共用体を参照するバインディングを定義したいと思います。奇妙な理由で共用体内のバインディングをlet定義できないことがわかっているので、その共用体の拡張機能の1つで使用したいと思います。let二重の目盛りは強調用です。

実際、私が欲しいのは、組合員のために一種の簡潔なコンストラクターを作ることです。let識別された共用体はコンストラクターを持つことができないことを理解していますが、おそらく上記のようにバインディングを使用せずにこれを行う方法はありますか?

4

1 に答える 1

9

タイプ拡張を使用してタイプを定義し、いくつかのletバインディング(トップレベルまたはモジュール内)を記述してmemberから、タイプに宣言を追加できます。

type Number =  
  | One of int
  | Two 

let one x = One(x) 

type Number with
  member this.Hi x = one x 

これを単一のファイルに書き込む場合、これは組み込み型の拡張子です。つまり、コードはメンバーを含む標準型としてコンパイルされます(メンバーはC#から直接使用できます)。別のファイルに拡張子を追加した場合、それは異なります(C#拡張子メソッドのように)。

F#クラス宣言の場合、let(メンバーを宣言する前に)クラス内でローカルバインディングを使用することもできますが、残念ながら、これは識別された共用体ではサポートされていません。

于 2012-10-04T15:41:25.277 に答える