Ответ 1
Как насчет Option
?
type tradeLeg = {
id : int option;
tradeId : int option;
legActivity : LegActivityType option;
actedOn : DateTime option;
estimates : legComponents option;
actuals : legComponents option;
}
У меня есть тип записи F # и хочу, чтобы одно из полей было необязательным:
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 я бы хотел, чтобы поле actual было необязательным. Кажется, я не могу понять это, и я не могу найти надежный пример в Интернете. Кажется, это должно быть легко, как
let ?t : int = None
но я, похоже, не могу заставить это работать. Ух - спасибо
Т
Как насчет Option
?
type tradeLeg = {
id : int option;
tradeId : int option;
legActivity : LegActivityType option;
actedOn : DateTime option;
estimates : legComponents option;
actuals : legComponents option;
}
Как указывалось другими, вы можете использовать тип '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 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
для классов клонирования и что классы не выполняют (автоматически) семантику структурной сравнения.
actuals : legComponents option;
в качестве комментария к существующим сообщениям, вот пример для типа опции:
..
id: int option;
..
match id with
| Some x -> printfn "the id is %d" x
| None -> printfn "id is not available"
вы можете заблокировать идентификатор с опцией:
let id = Some 10
или
let id = None
и перейдите на эту страницу MSDN: http://msdn.microsoft.com/en-us/library/dd233245%28VS.100%29.aspx.
Здесь еще один пример для типа опции, и вам, вероятно, будет интересен Seq.unfold.