F# 中的受歧视联盟是什么以及 OOP 中我们有什么类型的替代方案

2024-02-21

我正在从 C# 开始学习函数式编程。 当然,由于我对 C# 有着深入而详细的了解,我选择了我的第一个函数式语言 F#,并尝试投入时间来学习它。

现在我需要了解什么是受歧视的工会为什么它很重要以及为什么我们真正需要它?!

我确实做了很多研究

但导师、讲师、文章和博客文章的问题在于,人们实际上是在试图描述/教导我们受歧视的工会有很多函数式编程术语,这对我们来说当然是非常难以理解的,这些人的整个背景都是 OOP,只有一点 LINQ、表达式和高阶函数。

我是函数式世界的新手,我的大脑充满了 OOP 思维方式,因此很难从这个角度理解这个概念。

如果你实际上它,你会得到这种类型的响应:

可区分联合 # 您可以组合单例类型、联合类型、 类型保护和类型别名来构建称为的高级模式 可区分联合,也称为标记联合或代数数据 类型。可区分联合在函数式编程中很有用。

在我看来这确实没有任何意义。 所以请以人性化和正常的方式告诉我什么是受歧视联盟,为什么我们需要它?什么可以与 OOP 世界相比? (因为它真的会对我有帮助)

谢谢。


OOP 世界实际上并没有 DU 的严格模拟(这就是为什么它经常被称为“缺陷”),但最接近的是两级继承层次结构。

考虑以下 DU:

type Shape = Circle of radius:Float | Rectangle of width:Float * height:Float

The 语义这种类型的(即“含义”)可以这样模糊地表述:形状有两种风格 -Circle,它有一个半径,并且Rectangle,有宽度和高度,没有其他种类的形状

这将是roughly相当于以下继承层次结构:

abstract class Shape {}

class Circle : Shape { 
    public double Radius { get; set; }
}

class Rectangle : Shape {
    public double Width { get; set; }
    public double Height { get; set; }
}

这个 C# 代码片段也隐约表达了这样的想法:“形状有两种风格 -Circle and Rectangle”,但有一些重要的区别:

  1. 将来(或者在其他库中),可能会出现更多种类的形状。其他人可能只是声明一个继承自的新类Shape- 就这样吧。 F# 受歧视的联合不允许这样做。

  2. Circle and Rectangle是他们自己的类型。这意味着可以声明一个方法,该方法采用Circle,但不是一个Rectangle。 F# 受歧视的联合不允许这样做。在 F# 中,Shape是一种类型,但是Circle and Rectangle不是类型。不能有类型的变量、参数或属性Circle.

  3. F# 提供了许多用于处理 DU 的简化语法结构,而在 C# 中这些结构必须写得非常冗长,并且有很多噪音。


第(1)点和第(2)点表面上看起来像是限制(事实上,我在这两种情况下都使用了“不允许”一词),但实际上它们是特征。这个想法是,一些限制(不是全部)会导致更正确、更稳定的程序。回顾过去:“goto 被认为是有害的”,引用取代了指针,垃圾收集取代了手动内存管理 - 所有这些都带走了一些灵活性,有时还带走了性能,但通过大大提高的代码可靠性来弥补这一点。

F# DU 也是如此:除此之外可能没有其他类型的形状Circle and Rectangle,允许编译器检查使用的函数的正确性Shape- 即验证所有可能的情况均已得到处理。如果您稍后决定添加第三种形状,编译器将帮助找到需要处理这种新情况的所有位置。


第三点讲的是“让正确的事情变得容易,让错误的事情变得困难”。为此,F# 提供了一些有用的语法(例如模式匹配)和一些有用的默认值(例如不变性、结构比较),而在 C# 中必须手动编码并严格执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

F# 中的受歧视联盟是什么以及 OOP 中我们有什么类型的替代方案 的相关文章

随机推荐

  • 使用 IIS 10 设置 Laravel 5.4

    我想在 Windows Server 2016 上运行的 IIS 10 上部署 Laravel 项目 最简单且仍然安全的方法是什么 我就是这样做的 我不确定这是正确的方法 安装 URL 重写模块 https www iis net down
  • 设置 /p 空答案崩溃

    我是新来的 所以我会尽力做到最好 所以我正在尝试制作一个基于文本的 MS DOS 的 RPG 而且我进展得很好 因为我刚刚看到如果用户在 set p 处输入了无效的输入 比如一个空答案 只需按 Enter 或一个不在 IF 上的答案 批处理
  • JDI、Java 字节代码检测和 Java 代理(JWDP、JVMTI)

    我是调试器 仪器和 JVMTI 领域的新手 所以我对他们没什么疑问 JDI java调试器接口 JWDP javaagent和本机代理 JVMTI 有什么区别 Java Instrumentation API 在图中的位置 我正在使用 JD
  • 这三个for循环的复杂度是多少?

    Having 输入数组A 1 n N的长度A 算法 for int i N i gt 0 i Loop 1 for int j 1 j
  • 如何从 Google 云端硬盘下载文件

    我目前正在尝试制作一个从 Google Drive 下载文件的应用程序 在 Google Drive SDK 文档中 我找到了一个应该返回 System IO Stream 对象的示例方法 https developers google c
  • 文件名的 LEX 槽类型。 AMAZON.LITERAL 替代品

    我必须用示例话语创建意图 打开文件 文件名 显示 文件名 基本上 我必须有一个接受文件名的插槽 用户可以输入 打开我的文件报告 pdf 打开文件活动1 doc 打开文件去年报告 如果我可以使用 AMAZON LITERAL 类型 它会完美地
  • 从相同类型的另一个对象更新实体框架对象

    是否有任何方法可以从强类型对象更新对象而不列出每个字段 让我们考虑以下情况 using var context new MyDBEntities var user User Session EditedUser var oldUser co
  • Chrome 102:已被 CORS 策略阻止:请求的目标 IP 地址空间为“未知”,但资源位于“私有”地址空间中

    我们有一个托管在 LAN 中的基于 Web 的系统 非 SSL 从 Chrome 102 Windows Ubuntu 开始 我们面临一个随机的 CORS 问题 描述为 已被 CORS 策略阻止 请求具有目标 IP 地址空间 为 未知 但资
  • JS addeventListener 点击消失

    我创建了简单的fidlle https jsfiddle net 0nm4uLvd var cnt 1 function add var root document getElementById root root innerHTML br
  • 无法运行从 spring-boot jersey 生成的 jar

    我无法使用带有 jersey 项目的 spring boot 运行生成的 jar 文件 我遇到的例外是 Error starting Tomcat context Exception org springframework beans fa
  • 如果验证后我决定将元素移回原处,如何将 jquery-uidraggable 恢复为 true?

    我正在寻找一种方法 如果某些内容未验证 则从恢复状态触发事件 例如 如果元素不存在 它将从另一个列表中创建它 但如果它已经存在 则应该转到 else 并将元素返回到其原来的位置 catalog ul droppable tolerance
  • 如何在 Java 中使用 Scala 单例对象?

    我有一个需要在 Java 类中使用的 Scala 对象 这是 Scala 对象 object Person val MALE m val FEMALE f 如何在 Java 中使用这个 Scala 对象 到目前为止 我已尝试以下操作但没有成
  • 使用私有 git 存储库来阅读文档

    我安装了 read the docs 以从需要用户 密码身份验证的私有 git 存储库上的项目开始生成文档 手动导入项目时 如何输入用户名和密码以允许阅读文档克隆存储库 非常感谢 最大限度 我最近遇到了同样的问题 这里还有一个这样的问题为什
  • DataGrid 选项卡导航跳过列

    我在 WPF 中有一个带有模板列的数据网格 网格中的几列是只读的 其他焦点变为可编辑 而不是出现标签 文本框 复选框等 我想要实现的是 当我在网格的列中进行切换时 只读列将被跳过 有人知道如何实现这一目标吗 谢谢 弗拉丹 不 不工作 这是完
  • 如何实现自定义 UIDynamicBehavior 操作

    我一直在寻找一个示例 展示如何在 UIKit 动态中实现自定义 UIDynamicBehavior 所有教程和示例仅展示如何使用基元 碰撞 重力 附件 推动 捕捉等 组装 UIDynamicBehavior 在我的应用程序中 一些视图在屏幕
  • 在 Commodore 64 中绘制屏幕边框

    我的好奇心已经持续了 25 年 我很想了解其中的奥秘 在 Commodore 64 中 6569 VIC 无法寻址边界 您所能做的就是在中心区域 光标移动的区域 绘制像素 边框总是统一的 尽管你可以用 poke 53280 改变它的颜色 如
  • 在Mac OS上使用GCC为MS-DOS编译C程序(DOSBox)

    我在Mac OS X上的Snow Leopard下运行GCC 4 2 1 我想用它来编译我15年前写的一些旧的C C DOS游戏 以便我可以在下面运行它们DosBox http www dosbox com 为此 它们显然需要编译为 DOS
  • 两个列表,Python 中的比较速度更快

    我正在编写 python 2 7 脚本来比较两个列表 这些列表是通过读取文件内容从文件创建的 文件只是文本文件 没有二进制文件 文件 1 仅包含哈希值 某些明文单词的 MD5 和 文件 2 是 hash plain 列表具有不同的长度 从逻
  • Git 丢失更改[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 今天在使用 Git 的时候遇到了一些问题 我真的无法理解 我们的团队有一个私人 github 存储库 我从该共享存储库中提取了一些更改 完成
  • F# 中的受歧视联盟是什么以及 OOP 中我们有什么类型的替代方案

    我正在从 C 开始学习函数式编程 当然 由于我对 C 有着深入而详细的了解 我选择了我的第一个函数式语言 F 并尝试投入时间来学习它 现在我需要了解什么是受歧视的工会为什么它很重要以及为什么我们真正需要它 我确实做了很多研究 但导师 讲师