2010-04-14 3 views
13

Ich habe eine F # Satzart und will eines der Felder optional sein:F # Optional Satzfeld

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 ; 
} 

im tradeLeg Typ würde ich das die Ist-Feld mag optional sein. Ich kann es nicht herausfinden, noch kann ich ein zuverlässiges Beispiel im Internet finden. Es scheint so, als sollte dies einfach sein wie

let ?t : int = None 

aber ich kann wirklich nicht scheinen, um dies zu arbeiten. Ugh - danke

T

Antwort

6

Wie wäre es Option?

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

lass mich = StrangleMyself! Option Ich dachte ernsthaft, dass ich dies heute Nachmittag versuchte. Beschäftigtes Ein- und Ausführen von Besprechungen - Ich denke, ich muss besser Notizen machen und die Spezifikationen lesen. Ich bedanke mich demütig Todd – akaphenom

0
actuals : legComponents option; 
0

als Kommentar zu den bestehenden Beiträge, hier ist ein Beispiel für Optionstyp:

let id = Some 10 

oder

let id = None 
:

.. 
id: int option; 
.. 

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

Sie id mit einem Optionswert blind machen kann

und beziehen Sie sich auf diese MSDN Seite: http://msdn.microsoft.com/en-us/library/dd233245%28VS.100%29.aspx.

Here ist ein weiteres Beispiel für Optionstyp, und Sie werden wahrscheinlich mit Seq.Unfold interessiert sein.

22

Wie bereits erwähnt, können Sie den Typ 'a option verwenden. Dies erstellt jedoch kein optionales Datensatzfeld (dessen Wert Sie beim Erstellen nicht angeben müssen). Zum Beispiel:

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

Um einen Wert des record Typ zu erstellen, müssen Sie noch den Wert des flag Feld zur Verfügung zu stellen:

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 = "" } 

Leider (soweit ich weiß) Sie können‘ t Erstellen Sie einen Datensatz, der ein Optionsfeld enthält, das Sie bei der Erstellung auslassen können. Sie können jedoch einen Klassentyp mit einem Konstruktor verwenden und dann können Sie die ?fld Syntax verwenden, um optionale Parameter des Konstruktors zu erstellen:

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) 

Die Art der rcd1.Flagbool option sein wird, und Sie können mit ihm arbeiten Musterabgleich mit (wie von Yin Zhu demonstriert). Der einzige bemerkenswerte Unterschied zwischen Datensätzen und einfachen Klassen wie diesem besteht darin, dass Sie die with-Syntax nicht für Cloning-Klassen verwenden können und dass Klassen die Strukturvergleichssemantik nicht (automatisch) implementieren.

+0

Got it!thx: type record = {i: int flagge: bool option} lassen recd1 = {i = 0; Flag = None} let recd2 = {i = 0; flag = Some (true)} Typ record2 = { r1: record; r2: Aufzeichnungsoption } lassen recd3 = { r1 = {i = 0; Flag = Keine}; r2 = Einige ({i = 0; Flag = Einige (Wahr)})} Lassen recd4 = { r1 = {i = 0; Flag = Keine}; r2 = Keine} – akaphenom

+0

@akaphenom: Code in Kommentaren ist nicht besonders lesbar. Aber ich denke, dass Ihr Beispiel mit Klassen wie folgt aussehen könnte: 'let recd4 = Record2 (Record (0))' (ohne 'r2' und' flag') oder zum Beispiel 'recd5 = Record2 (Record (0, true) , Record (1, false)) 'beim Einstellen aller Eigenschaften. –