F #: Nullable <T>Поддержка - PullRequest
22 голосов
/ 03 июня 2009

Как правильно использовать Nullable в F #?

В настоящее время я использую это, но это выглядит ужасно грязно.

let test (left : Nullable<int>) = if left.HasValue then left.Value else 0

Console.WriteLine(test (new System.Nullable<int>()))
Console.WriteLine(test (new Nullable<int>(100)))

let x = 100
Console.WriteLine(test (new Nullable<int>(x)))

Ответы [ 2 ]

21 голосов
/ 03 июня 2009

Боюсь, что нет синтаксического сахара для обнуляемых типов в F # (в отличие от C #, где вы просто добавляете ? к типу). Так что да, код, который вы там показываете, выглядит ужасно многословно, но это единственный способ использовать тип System.Nullable<T> в F #.

Тем не менее, я подозреваю, что вы действительно хотите использовать типы опций . На странице MSDN есть несколько достойных примеров:

let keepIfPositive (a : int) = if a > 0 then Some(a) else None

и

open System.IO
let openFile filename =
   try
       let file = File.Open (filename, FileMode.Create)
       Some(file)
   with
       | exc -> eprintf "An exception occurred with message %s" exc.Message; None 

Очевидно, что намного приятнее в использовании!

Опции по существу выполняют роль обнуляемых типов в F #, и я должен подумать, что вы действительно хотите использовать их, а не обнуляемые типы (если только вы не взаимодействуете с C #). Разница в реализации заключается в том, что типы опций формируются из различимого объединения из Some(x) и None, тогда как Nullable<T> является нормальным классом в BCL с небольшим синтаксическим сахаром в C #.

16 голосов
/ 29 августа 2011

Вы можете позволить F # выводить большинство типов там:

let test (left : _ Nullable) = if left.HasValue then left.Value else 0

Console.WriteLine(test (Nullable()))
Console.WriteLine(test (Nullable(100)))

let x = 100
Console.WriteLine(test (Nullable(x)))

Вы также можете использовать активный шаблон , чтобы применить сопоставление с шаблоном для типов Nullable:

let (|Null|Value|) (x: _ Nullable) =
    if x.HasValue then Value x.Value else Null

let test = // this does exactly the same as the 'test' function above
    function
    | Value v -> v
    | _ -> 0

Я недавно писал в блоге о обнуляемых типах в F # [/ shameless_plug]

...