2012-02-22 66 views
1

你知道我如何初始化变量ret下面?如何用fsharp中的选项类型初始化记录

type ReferenceDataResponse = 
     { ResponseError : ResponseError option 
     SecurityDatas : SecurityData array option } 


    let ToReferenceDataResponse(elem:Bloomberglp.Blpapi.Element) = 
     let ret = { ResponseError = null ; SecurityDatas = null } 

     if elem.HasElement("ResponseError") then 
     ... 
     end 

PS:我想我必须以某种方式宣布我的可变记录值

UPDATE:

正如评论所说,我什么都没有之前在我的代码的前一个用法:

type ZeroOrMany<'a> = 
    | Many of 'a array 
    | None 

为符号'None'创建了一个新的定义,它隐藏了“Option.None”我试图引用她即

回答

4

想要None而不是null

至于更新字段,您可以标记它们mutable或使用复制和更新表达式:let newRet = { ret with ResponseError = Some(error) }。你使用哪一个取决于你是否需要持久性。

+0

啊!我试过了,它没有工作:我在我的定义中使用了None类:类型ZeroOrMany <'a> = |许多'阵列 |没有 – nicolas 2012-02-22 18:10:34

+0

啊,是的。最近的'None'的定义会隐藏以前的。 – Daniel 2012-02-22 18:12:20

+0

如果你有这样的不明确性,你可以使用'Option.None',或者必要时由于某种原因,'Option .None'。 – YotaXP 2012-02-25 19:12:05

5

要创建一个空的记录,你可以使用None

let ret = { ResponseError = None; SecurityDatas = None } 

要申报记录作为可变我不认为。相反,您可能希望创建一个包含某个字段的新值的克隆(即ResponseCode)。例如,如果你有一个解析ResponseError的功能,你会写是这样的:

// Start with an empty record that does not contain anything 
let ret = { ResponseError = None; SecurityDatas = None } 

// Add ResponseError if it is defined 
let ret1 = 
    if elem.HasElement("ResponseError") then 
    let responseErr = ParseResponseError (elem.GetElement("ResponseError")) 
    // Return a new value, with ResponseError set 
    { ret with ResponseError = Some(responseErr) } 
    else 
    // Response error was not set, so we just return the original 
    ret 

如果你确实需要可变的记录,那么你可以标记字段作为mutable,但是这并不常用 - 如果你正在学习函数式编程,然后试着让事情变得不可变 - 这样,你将学会如何以不同的方式思考问题。 //做更多的事情在这里 - 也许返回最终结果 RET1

+0

非常有趣,谢谢 – nicolas 2012-02-22 20:57:16

0

上现有的两个答案,一个微小的变化可能是:

let ToReferenceDataResponse(elem:Bloomberglp.Blpapi.Element) = 

    if elem.HasElement("ResponseError") then 
     let responseErr = ParseResponseError (elem.GetElement("ResponseError")) 
     { ResponseError = responseErr ; SecurityDatas = None } 
    else 
     { ResponseError = None ; SecurityDatas = None } 
+0

这将不会编译,因为你设置'SecurityDatas = null'这是不允许的 – 2012-02-23 07:20:20

+0

@JohnPalmer,好点,遗漏在我的部分。 – Benjol 2012-02-23 07:35:41