选项类型如何在F#中工作?

thr*_*thr 9 .net c# f#

所以我一直在阅读Apress的Expert F#书,主要是在构建一个玩具式的F#库时使用它作为参考,但有一件事我没有掌握,那就是"选项"类型.

它是如何工作的以及它的真实用途是什么?

Jon*_*eet 20

选项类型是至少相似Nullable<T>在C#和引用类型.type的值Option<T>None表示没有封装值或Some具有特定值的T.这就像一个的方式Nullable<int>在C#是任一空值,具有相关联的int-和的方式String在C#值是一个空引用,或者是指一个字符串对象.

当您使用的期权价值时,通常指定两个路径-一个用于那里的情况相关的值,一个地方有没有.换句话说,这段代码:

let stringLength (str:Option<string>) =
  match str with
  | Some(v) -> v.Length
  | None -> -1
Run Code Online (Sandbox Code Playgroud)

类似于:

int StringLength(string str)
{
    if (str != null)
    {
        return str.Length;
    }
    else
    {
        return -1;
    }
}
Run Code Online (Sandbox Code Playgroud)

我相信一般的想法是强迫你(好吧,差不多)处理"没有相关的值/对象"的情况使你的代码更健壮.


Kur*_*out 5

当函数或方法应该“可能”或“可选”返回值时使用它。在 C# 中,您可能会返回 null,或者为值类型返回Null 对象或可能的 Nullable。

返回 null(最常见的情况)的缺点是它不是类型安全的:null 是所有类型的实例,因此您稍后会遇到各种令人毛骨悚然的 null 引用情况。

Option 类型是所谓的可区分联合类型,具有两个构造函数:None 和 Some a。None 明确表示您没有价值。基本上它是空对象模式的概括。


Bri*_*ian 5

实际使用的最佳示例之一是.Net中的TryParse模式.见上半场

http://lorgonblog.spaces.live.com/blog/cns!701679AD17B6D310!181.entry

讨论.