F#:Nullable <T>支持

Jon*_*len 23 null f#

在F#中使用Nullable的正确方法是什么?

目前我正在使用它,但它似乎非常混乱.

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

Nol*_*rin 22

我担心F#中的可空类型没有语法糖(不像在C#中你只需要附加一个?类型).所以是的,你在那里展示的代码确实看起来非常冗长,但这是System.Nullable<T>在F#中使用该类型的唯一方法.

但是,我怀疑你真正想要使用的是选项类型.MSDN页面上有一些不错的例子:

let keepIfPositive (a : int) = if a > 0 then Some(a) else None
Run Code Online (Sandbox Code Playgroud)

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

显然使用起来更好!

选项基本上履行了F#中可空类型的作用,我认为你真的想要使用它们而不是可以为空的类型(除非你正在使用C#进行互操作).在实施所不同的是类型由一个形成该选项识别联合Some(x)None,而Nullable<T>在BCL一个普通的类,在C#位的语法糖.

  • 现在有大量的语法支持。例如,请参阅[可以取空的所有运算符](https://docs.microsoft.com/zh-cn/dotnet/fsharp/language-reference/symbol-and-operator-reference/nullable-operators)作为诸如Option.ofNullable,Option.toNullable等功能的函数。 (2认同)

Mau*_*fer 16

你可以让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)))
Run Code Online (Sandbox Code Playgroud)

您还可以使用活动模式在可空类型上应用模式匹配:

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

我前段时间写过关于F#中可以空的类型的博客[/ shameless_plug]