我正在从 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
”,但有一些重要的区别:
-
将来(或者在其他库中),可能会出现更多种类的形状。其他人可能只是声明一个继承自的新类Shape
- 就这样吧。 F# 受歧视的联合不允许这样做。
-
Circle
and Rectangle
是他们自己的类型。这意味着可以声明一个方法,该方法采用Circle
,但不是一个Rectangle
。 F# 受歧视的联合不允许这样做。在 F# 中,Shape
是一种类型,但是Circle
and Rectangle
不是类型。不能有类型的变量、参数或属性Circle
.
-
F# 提供了许多用于处理 DU 的简化语法结构,而在 C# 中这些结构必须写得非常冗长,并且有很多噪音。
第(1)点和第(2)点表面上看起来像是限制(事实上,我在这两种情况下都使用了“不允许”一词),但实际上它们是特征。这个想法是,一些限制(不是全部)会导致更正确、更稳定的程序。回顾过去:“goto 被认为是有害的”,引用取代了指针,垃圾收集取代了手动内存管理 - 所有这些都带走了一些灵活性,有时还带走了性能,但通过大大提高的代码可靠性来弥补这一点。
F# DU 也是如此:除此之外可能没有其他类型的形状Circle
and Rectangle
,允许编译器检查使用的函数的正确性Shape
- 即验证所有可能的情况均已得到处理。如果您稍后决定添加第三种形状,编译器将帮助找到需要处理这种新情况的所有位置。
第三点讲的是“让正确的事情变得容易,让错误的事情变得困难”。为此,F# 提供了一些有用的语法(例如模式匹配)和一些有用的默认值(例如不变性、结构比较),而在 C# 中必须手动编码并严格执行。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)