Как инициализировать запись с типами опций в fsharp - PullRequest
1 голос
/ 22 февраля 2012

Знаете ли вы, как я могу инициализировать переменную 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

ps: я думаю, что мне нужно как-то объявить изменяемые значения моей записи

ОБНОВЛЕНИЕ:

Как уже упоминалось в комментарии, я ранее использовал None в моем коде:

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

Это создало новое определение для символа «Нет», который скрывал «Option.None», на который я пытался ссылаться здесь.

Ответы [ 3 ]

5 голосов
/ 22 февраля 2012

Чтобы создать пустую запись, вы можете использовать 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

4 голосов
/ 22 февраля 2012

Вы хотите None вместо null.

Что касается обновления полей, вы можете пометить их mutable или использовать выражения копирования и обновления: let newRet = { ret with ResponseError = Some(error) }. Какой из них вы используете, зависит от того, нужна ли вам настойчивость.

0 голосов
/ 23 февраля 2012

Небольшое отклонение от двух существующих ответов может быть:

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 }
...