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.
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