Как отмечали другие, вы можете использовать тип '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
, и вы можете работать с ним, используя сопоставление с образцом (как продемонстрировал Инь Чжу). Единственное заметное отличие между записями и простыми классами, такими как этот, заключается в том, что вы не можете использовать синтаксис with
для клонирования классов и что классы (автоматически) не реализуют семантику структурного сравнения.