在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#位的语法糖.
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]
| 归档时间: |
|
| 查看次数: |
11495 次 |
| 最近记录: |