33

次の単一ケースの識別共用体があるとします。

type OrderId = OrderId of string

ある時点で、実際の文字列が必要になります。それを抽出するために私が見つけた方法は次のとおりです。

let id = match orderId with OrderId x -> x

これを行うより簡潔な方法はありますか?

私の使用は特別な場合であり、次のような方法があるかどうか疑問に思っているだけで、可能性をカバーしたことを確認するために一致が理にかなっていることを理解しています:

let OrderId id = orderId
4

2 に答える 2

44

あなたはほとんどそこにいます。コンパイラが let-bound をパターン マッチングとして解釈するには、括弧が必要です。

let (OrderId id) = orderId

が関数のパラメーターである場合orderId、そこで直接パターン マッチングを使用することもできます。

let extractId (OrderId id) = id
于 2012-09-01T23:21:23.593 に答える
19

判別共用体を使用して単一の値を保持する場合 (これは便利な F# プログラミング手法です)、値にアクセスするためのプロパティを使用してそれを定義するのが理にかなっている場合があります。

type OrderId = 
  | OrderId of string 
  member x.Value = let (OrderId v) = x in v

の実装は、パッドによって投稿されValueたパターン マッチングを使用しています。typeletの値がある場合は、次のように記述できます。orderIdOrderId

let id = orderId.Value

ただし、(OrderId id)プロパティ アクセスは、コンパイラが型を既に認識している場合にのみ機能するため、使用するパターン マッチングは依然として非常に便利ですorderId(そのため、通常は関数の引数でパターン マッチングを使用しますが、他の値にはプロパティ アクセスを使用します)。

于 2012-09-02T23:21:52.160 に答える