我正在冻结f#的选项类型。我有3本书,我尽我所能,但我没有得到它们。
有人有清晰简洁的解释,也许是一个现实世界的例子吗?
TIA
加里
答案 0 :(得分:5)
Brian's answer被评为option
类型的最佳解释,因此您应该阅读它:-)。我将尝试使用简单的F#示例写一个更简洁的解释......
假设您有一个产品数据库,并且您需要一个搜索数据库并返回具有指定名称的产品的函数。当没有这样的产品时,该功能应该做什么?使用null
时,代码可能如下所示:
Product p = GetProduct(name);
if (p != null)
Console.WriteLine(p.Description);
这种方法的一个问题是您不必执行检查,因此您可以轻松编写在未找到产品时会引发意外异常的代码:
Product p = GetProduct(name);
Console.WriteLine(p.Description);
使用option
类型时,您可能会明确缺少值。在F#中定义的类型不能具有null
值,并且当您要编写可能返回值或不返回值的函数时,您无法返回Product
- 而是需要返回option<Product>
,所以上面的代码看起来像这样(我添加了类型注释,以便您可以看到类型):
let (p:option<Product>) = GetProduct(name)
match p with
| Some prod -> Console.WriteLine(prod.Description)
| None -> () // No product found
您无法直接访问Description
属性,因为搜索的重新搜索不是Product
。要获得实际的Product
值,您需要使用模式匹配,这会强制您在缺少值时处理该情况。
摘要。总而言之,option
类型的目的是在类型中明确显示“缺失值”方面,并强制您检查每个值是否可用你处理可能缺失的值的时间。
答案 1 :(得分:2)
请参阅,
http://msdn.microsoft.com/en-us/library/dd233245.aspx
选项类型背后的直觉是它“实现”一个空值。但与null相比,您必须显式 require 一个值可以为null,而在大多数其他语言中,默认情况下引用可以为null。如果你熟悉那些,那么与SQLs NULL / NOT NULL有相似之处。
为什么这个聪明?它很聪明,因为语言可以假设任何表达式的无输出都可以为null。因此,它可以从代码中消除所有空指针检查,从而产生很多额外的速度。此外,如果他或她想要生成安全的代码,它解决了程序员必须检查null-case的问题。
对于程序 需要空值的少数情况,存在选项类型。例如,考虑一个要求.ini文件中的密钥的函数。返回的密钥是整数,但.ini文件可能不包含密钥。在这种情况下,如果找不到密钥,则返回'null'是有意义的。没有任何整数值有用 - 用户可能在文件中输入了这个整数值。因此,我们需要“提升”整数域并给它一个代表“无信息”的新值,即空值。所以我们将'int'包装成'int选项'。现在,如果没有整数值,我们将得到'None',如果有一个整数值,我们将得到'Some(N)',其中N是有问题的整数值。
选择有两个美丽的后果。一,我们可以使用F#的一般模式匹配特征来区分例如案例表达式中的值。二,用于定义选项类型的代数数据类型框架向程序员公开。也就是说,如果F#中没有选项类型,我们可以自己创建它!