15

F# レコード タイプがあり、フィールドの 1 つをオプションにしたい:

type legComponents = {
    shares : int<share> ;
    price : float<dollar / share> ;
    totalInvestment : float<dollar> ;
}

type tradeLeg = {
    id : int ;
    tradeId : int ;
    legActivity : LegActivityType ;
    actedOn : DateTime ;
    estimates : legComponents ;
    ?actuals : legComponents ; 
}

tradeLeg タイプでは、actuals フィールドをオプションにしたいと考えています。私はそれを理解できないようであり、ウェブ上で信頼できる例を見つけることもできないようです. これは次のように簡単なはずです

let ?t : int = None

しかし、私は本当にこれを機能させることができないようです。うーん - ありがとう

T

4

4 に答える 4

27

他の人が指摘したように、'a optionタイプを使用できます。ただし、これはオプションのレコード フィールドを作成しません (作成時に値を指定する必要はありません)。例えば:

type record = 
  { id : int 
    name : string
    flag : bool option }

タイプの値を作成するには、フィールドrecordの値を提供する必要があります。flag

let recd1 = { id = 0; name = "one"; flag = None }     
let recd2 = { id = 0; name = "one"; flag = Some(true) } 

// You could workaround this by creating a default record 
// value and cloning it (but that's not very elegant either):
let defaultRecd = { id = 0; name = ""; flag = None }     
let recd1 = { defaultRecd  with id = 0; name = "" }

残念ながら、(私の知る限り) レコードを作成するときに省略できる真のオプション フィールドを持つレコードを作成することはできません。ただし、コンストラクターでクラス型を使用してから、?fld構文を使用してコンストラクターのオプションのパラメーターを作成できます。

type Record(id : int, name : string, ?flag : bool) = 
  member x.ID = id
  member x.Name = name
  member x.Flag = flag

let rcd1 = Record(0, "foo")
let rcd2 = Record(0, "foo", true)

の型はrcd1.Flagになりbool option、パターン マッチングを使用して操作できます (Yin Zhu によって示されています)。レコードとこのような単純なクラスの唯一の注目すべき違いは、withクラスを複製するための構文を使用できないことと、クラスが構造比較セマンティクスを (自動的に) 実装しないことです。

于 2010-04-14T01:37:23.933 に答える
8

どうOptionですか?

type tradeLeg = {
    id : int option;
    tradeId : int option;
    legActivity : LegActivityType option;
    actedOn : DateTime option;
    estimates : legComponents option;
    actuals : legComponents option; 
}
于 2010-04-14T00:56:55.027 に答える
1

既存の投稿へのコメントとして、オプション タイプの例を次に示します。

..
id: int option;
..

match id with
  | Some x -> printfn "the id is %d" x
  | None -> printfn "id is not available" 

オプション値で id をブラインドできます:

let id = Some 10

また

let id = None

この MSDN ページを参照してください: http://msdn.microsoft.com/en-us/library/dd233245%28VS.100%29.aspx

オプション タイプの別の例を次に示します。おそらく Seq.unfold に興味があるでしょう。

于 2010-04-14T01:29:32.580 に答える
0
actuals : legComponents option;
于 2010-04-14T00:56:06.293 に答える