15

我有一个 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 类型中,我希望实际字段是可选的。我似乎无法弄清楚,我似乎也无法在网上找到可靠的例子。看起来这应该很容易

let ?t : int = None

但我真的似乎无法让它发挥作用。呃-谢谢

4

4 回答 4

27

正如其他人指出的那样,您可以使用该'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语法来克隆类,并且类不会(自动)实现结构比较语义。

于 2010-04-14T01:37:23.933 回答
8

怎么样Option

type tradeLeg = {
    id : int option;
    tradeId : int option;
    legActivity : LegActivityType option;
    actedOn : DateTime option;
    estimates : legComponents option;
    actuals : legComponents option; 
}
于 2010-04-14T00:56:55.027 回答
1

作为对现有帖子的评论,这是选项类型的示例:

..
id: int option;
..

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

您可以使用选项值隐藏 id:

let id = Some 10

或者

let id = None

并参考这个 MSDN 页面:http: //msdn.microsoft.com/en-us/library/dd233245%28VS.100%29.aspx

是选项类型的另一个示例,您可能会对 Seq.unfold 感兴趣。

于 2010-04-14T01:29:32.580 回答
0
actuals : legComponents option;
于 2010-04-14T00:56:06.293 回答