2012-02-22 30 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