将 OptionT 与空值一起使用

在函数式编程语言中,如 F# null 值被认为是潜在有害和差的风格(非惯用)。

考虑一下这个 C# 代码:

string x = SomeFunction ();
int    l = x.Length;

如果 xnullx.Length 会抛出让我们添加保护:

string x = SomeFunction ();
int    l = x != null ? x.Length : 0;

要么:

string x = SomeFunction () ?? "";
int    l = x.Length;

要么:

string x = SomeFunction ();
int    l = x?.Length;

在惯用 F# null 值没有使用所以我们的代码如下所示:

let x = SomeFunction ()
let l = x.Length

但是,有时需要表示空值或无效值。然后我们可以使用 Option<'T>

let SomeFunction () : string option = ...

SomeFunction 要么返回 Some string 值,要么返回 None。我们使用模式匹配来提取 string

let v =
  match SomeFunction () with
  | Some x  -> x.Length
  | None    -> 0

这段代码比以下更脆弱的原因是:

string x = SomeFunction ();
int    l = x.Length;

是因为我们不能在 string option 上叫 Length。我们需要使用模式匹配来提取 string 值,并且通过这样做我们保证 string 值可以安全使用。