如何在fsharp中使用选项类型初始化记录

nic*_*las 1 f# initialization mutable option

你知道如何在下面初始化变量ret吗?

   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
Run Code Online (Sandbox Code Playgroud)

ps:我想我已经以某种方式声明我的记录值是可变的

更新:

正如评论中所提到的,我之前在我的代码中使用过None:

 type ZeroOrMany<'a> = 
     | Many of 'a array 
     | None
Run Code Online (Sandbox Code Playgroud)

这为符号'None'创建了一个新的定义,它隐藏了我试图在这里引用的"Option.None".

Tom*_*cek 5

要创建空记录,您可以使用None:

let ret =  { ResponseError = None; SecurityDatas = None } 
Run Code Online (Sandbox Code Playgroud)

我认为您不想将该记录声明为可变.相反,您可能希望创建一个包含某个字段的新值的克隆(即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
Run Code Online (Sandbox Code Playgroud)

如果您确实需要可变记录,那么您可以将该字段标记为mutable,但不经常使用 - 如果您正在学习函数式编程,那么尝试保持可变性 - 这样,您将学习如何以不同方式思考问题.//在这里做更多事情 - 也许返回最终结果ret1