f# - 选项类型和可为空类型之间有什么区别?

标签 f# null

在 F# 咒语中,似乎有一种本能的回避 null , Nullable<T>和它的同类。作为交换,我们应该改为使用选项类型。老实说,我真的看不出有什么区别。

  • 我对 F# 选项类型的理解是,它允许您指定一个可以包含其任何正常值的类型,或者 None .例如,一个 Option<int>允许 int 的所有值可以有,除了None .
  • 我对 C# 可空类型的理解是,它允许您指定一个可以包含其任何正常值的类型,或者 null .例如,Nullable<int>又名 int?允许 int 的所有值可以有,除了null .

  • 有什么不同?用 Nullable 做一些词汇替换和 Option , nullNone ,你基本上有同样的事情。有什么好大惊小怪的null关于?

    最佳答案

    F#选项一般,可以创建Option<'T>适用于任何类型 'T .
    Nullable<T>是一种非常奇怪的类型;您只能将其应用于结构体,尽管 Nullable type 本身就是一个结构体,它不能应用于自身。所以你不能创建 Nullable<Nullable<int>> ,而您可以创建 Option<Option<int>> .他们必须做一些框架魔术才能使 Nullable 发挥作用。 .无论如何,这意味着对于 Nullables,您必须先验地知道类型是类还是结构,如果是类,则只需要使用 null 而不是 Nullable。这是一个丑陋的泄漏抽象;它的主要值(value)似乎与数据库互操作有关,因为我想在数据库域中处理“int,或无值”对象是很常见的。

    我认为,当涉及到 null 和 Nullable 时,.Net 框架只是一团糟。 .您可以通过 Option 来争辩说 F#“增加了困惑”。 ,或者它通过建议您避免使用 null/Nullable 来将您从困惑中解救出来(除非对互操作绝对必要)并通过 Option 专注于干净的解决方案s。你可以找到两种观点的人。

    你可能还想看

    Best explanation for languages without null

    关于f# - 选项类型和可为空类型之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11146825/

    相关文章:

    asp.net-web-api - 我无法在本地主机上使用 Android 模拟器的类型提供程序

    r - 计算包含 NA 的向量

    f# - 评估引号内的函数

    f# - 为递归函数的性能分析 F#

    F# 函数,其中 x 可以被 2 或 3 整除,但不能被 5 整除

    c# - XMLDocument GetElementByID 返回 null

    javascript - 使用 Array.indexOf 从数组中删除空值?

    regex - 使用 REGEX 在 Hive Create 和 Load Query 中获取空值

    javascript - 将其转换为数据表后无法访问表格单元格

    parsing - FParsec 只解析括号内的 expr