2012-02-22 6 views
1

変数に初期化する方法を知っていますか?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:コメントで述べたように、私は前に私のコードでなしの以前の使用を持っていた

私は彼女を参照しようとしていた「Option.Noneを」隠れていたシンボル「なし」の新しい定義を作成し
type ZeroOrMany<'a> = 
    | Many of 'a array 
    | None 

e。

答えて

4

nullの代わりにNoneが必要です。

フィールドを更新する場合は、mutableとマークするか、コピーと更新の式let newRet = { ret with ResponseError = Some(error) }を使用します。どちらを使うかは、永続性が必要かどうかによって決まります。空のレコードを作成するには

+0

AH!私はそれを試み、それは動作していませんでした:私は私の定義のいずれかでクラスNoneを使用しました:タイプZeroOrMany <'a> = |多くの「配列」 |なし – nicolas

+0

ああ、そうです。より最近の 'None'の定義は前のものを隠すでしょう。 – Daniel

+0

そのようなあいまいさがある場合は、 'Option.None'を使用するか、何らかの理由で必要に応じて' Option .None'を使用して特定することができます。 – YotaXP

5

、あなたはNoneを使用することができます。

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

私はあなたが可変として、レコードを宣言したいとは思いません。代わりに、おそらくいくつかのフィールド(つまりResponseCode)の新しい値を含むクローンを作成したいと思うでしょう。あなたが実際に変更可能なレコードが必要な場合は

// 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としてフィールドをマークすることができますが、それは非常に頻繁に使用されていない - 場合:たとえば、あなたがResponseErrorを解析する機能を持っている場合のように、あなたが何かを書きます関数型プログラミングを学習してから、物事を変えないようにしてください。この方法では、問題の考え方を違う方法で学ぶことができます。 が//ここにもっと何かする - 多分最終的な結果に RET1

+0

非常に興味深いです、ありがとうございます – nicolas

0

を返す2件の既存の回答のマイナーバリエーションは次のようになります。

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'を設定してもコンパイルされません。 –

+0

@JohnPalmer、良い点、私の部分の省略。 – Benjol

関連する問題