F # как вернуть значение кортеж или нуль - PullRequest
4 голосов
/ 06 июня 2010
    let retVal =
      if reader.Read() then
        (reader.GetString(0), getBytesData reader 1, reader.GetDateTime(2))
      else
        null

F # не позволяет возвращать ноль

Как я могу получить возвращаемое значение как кортеж или ноль?

Ответы [ 2 ]

11 голосов
/ 06 июня 2010

Это не значит, что F # не позволяет вам возвращать ноль.

Это потому, что тогда часть и другая часть имеют разные типы.

Вы можете использовать Тип опции .

let retVal =
  if reader.Read() then
    Some (reader.GetString(0), getBytesData reader 1, reader.GetDateTime(2))
  else
    None

когда вы используете retVal, вы используете сопоставление с образцом:

match retVal with
| Some v -> ...
| None -> // null case
8 голосов
/ 06 июня 2010

Чтобы добавить дополнительную информацию к ответу Инь Чжу, ситуация со значением null на языке F # выглядит следующим образом:

  • F # типы, такие как кортежи (например, int * int), что является именно вашим случаем, не имеют null в качестве допустимого значения, поэтому вы не можете использовать null в этом случае (другие такие типы значения функций, например int -> int, списки и большинство типов библиотек F #)

  • Типы из .NET Framework могут иметь значение null, поэтому вы можете, например, написать:

    let (rnd:Random) = null
    

    Это не идиоматический стиль F #, но он разрешен.

  • Если вы определите свой собственный тип F #, он не позволит автоматически использовать null в качестве допустимого значения типа (что преследует цель минимизировать использование null в F #). Однако вы можете явно разрешить это:

    [<AllowNullLiteral>]
    type MyType = ...
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...