我在理解F#中“null”和Option的共存时遇到了问题。在一本书中,我已经读过,在F#中,null值不是一个合适的值,因为这样F#消除了过多的空值检查。但它仍允许F#中的空初始化引用。换句话说,你可以拥有空值,但你没有武器来保护自己。为什么不用Options完全替换null。是因为.NET库或语言的兼容性问题还存在吗?如果是,你能给出一个例子,说明为什么它不能被Option替换?
答案 0 :(得分:7)
F#尽可能避免使用null
,但它存在于.NET生态系统中,因此无法完全避免它。在一个完美的世界中,没有null
值,但你有时需要它们。
例如,您可能需要使用null
作为参数调用.NET方法,并且可能需要检查.NET方法调用的结果是否为null
。
F#解决这个问题的方式是:
Null (当您在.NET中声明类型的值或参数时,可以使用null
作为该类型的值;您可以测试它是否等于null
)
选项,因为在F#中声明的类型值不能是null
(并且编译器禁止使用null
作为值这些类型)。
在F#编程中,您也可以在使用.NET类型时使用选项(如果您可以控制其值的创建方式)。您永远不会创建null
值,然后使用选项来保证您始终能够正确处理缺失值。
这是唯一的选择。如果您想在访问.NET API时隐式地查看所有类型作为选项,几乎所有方法都是这样的:
option<Control> GetNextChild(option<Form> form, option<Control> current);
...使用这样的API进行编程会非常痛苦。