2010-04-14 7 views
13

J'ai un type d'enregistrement F # et que vous voulez un des champs à option:F # Option champ d'enregistrement

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

dans le type tradeLeg Je voudrais que le le champ actuals être en option. Je n'arrive pas à comprendre et je n'arrive pas à trouver un exemple fiable sur le web. Il semble que cela devrait être facile comme

let ?t : int = None 

mais je ne peux vraiment pas sembler que cela fonctionne. Ugh - merci

T

Répondre

6

Que diriez-vous Option?

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

laissez-moi = StrangleMyself! Option J'ai sérieusement pensé que j'avais essayé, cet après-midi. Occupé à courir dans et hors de la réunion - je suppose que je dois faire un meilleur travail de prendre des notes et de lire les spécifications. Je vous remercie humblement Todd – akaphenom

0
actuals : legComponents option; 
0

comme commentaire aux postes existants, voici un exemple pour le type d'option:

.. 
id: int option; 
.. 

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

vous aveugle id avec une valeur d'option:

let id = Some 10 

ou

let id = None 

et de faire référence à ce MSDN page: http://msdn.microsoft.com/en-us/library/dd233245%28VS.100%29.aspx.

Here est un autre exemple pour le type d'option, et vous serez probablement intéressé par Seq.unfold.

22

Comme d'autres l'ont souligné, vous pouvez utiliser le type 'a option. Toutefois, cela ne crée pas de champ d'enregistrement facultatif (dont vous n'avez pas besoin de spécifier la valeur lors de sa création). Par exemple:

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

Pour créer une valeur du type record, vous devez toujours fournir la valeur du champ 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 = "" } 

Malheureusement, (pour autant que je sache), vous pouvez » t créer un enregistrement qui aurait un véritable champ d'option que vous pourriez omettre lors de sa création. Cependant, vous pouvez utiliser un type de classe avec un constructeur et vous pouvez utiliser la syntaxe ?fld pour créer des paramètres optionnels du constructeur:

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) 

Le type de rcd1.Flag sera bool option et vous pouvez travailler avec elle en utilisant la correspondance de motif (comme démontré par Yin Zhu). La seule différence notable entre les enregistrements et les classes simples comme celle-ci est que vous ne pouvez pas utiliser la syntaxe with pour les classes de clonage et que les classes n'implémentent pas (automatiquement) la sémantique de comparaison structurelle.

+0

thx: enregistrement de type = {i: int flag: option booléenne} let recd1 = {i = 0; flag = Aucune} let recd2 = {i = 0; flag = Some (true)} type enregistrement2 = { r1: enregistrement; r2: option d'enregistrement } let recd3 = { r1 = {i = 0; flag = Aucune}; r2 = Quelques ({i = 0; flag = Some (true)})} let recd4 = { r1 = {i = 0; flag = Aucune}; r2 = Aucune} – akaphenom

+0

@akaphenom: Le code dans les commentaires n'est pas particulièrement lisible. Mais je suppose que votre exemple en utilisant des classes pourrait ressembler à ceci: 'let recd4 = Record2 (Record (0))' (sans définir 'r2' et' flag') ou par exemple 'recd5 = Record2 (Record (0, true)) , Record (1, false)) 'lors de la définition de toutes les propriétés. –

Questions connexes