.net - 什么是 F# 中的可区分联合以及我们在 OOP 中有什么类型的替代方案

标签 .net functional-programming f# discriminated-union

我正在从 C# 进入函数式编程。
当然,由于我对 C# 的深入了解,我选择了 F# 作为我的第一门函数式语言,并试图花时间学习它。

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

我真的做了很多研究

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

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

如果你真的 google它,你会得到那种类型的响应:

Discriminated Unions # You can combine singleton types, union types, type guards, and type aliases to build an advanced pattern called discriminated unions, also known as tagged unions or algebraic data types. Discriminated unions are useful in functional programming.



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

谢谢你。

最佳答案

有区别的联合有点像 OOP 中的类层次结构。 OOP 中的经典示例类似于动物,可以是狗或猫。在 OOP 中,您可以将其表示为具有一些抽象方法(例如 MakeAnimalNoise)和狗和猫的具体子类的基类。

在函数式编程中,匹配的东西是一个可区分的联合 Animal有两种情况:

type Animal =  
  | Dog of breed:string
  | Cat of fluffynessLevel:int

在 OOP 中,您有虚拟方法。在 FP 中,您可以使用模式匹配将操作编写为函数:
let makeAnimalNoise animal = 
  match animal with
  | Dog("Chihuahua") -> "woof sqeek sqeek woof"
  | Dog(other) -> "WOOF"
  | Cat(fluffyness) when fluffyness > 10 -> "MEEEOOOOW"
  | Cat(other) -> "meow"

FP 和 OOP 方法之间有一个重要区别:
  • 使用抽象类,您可以轻松添加新案例,但添加新操作需要修改所有现有类。
  • 使用可区分联合,您可以轻松添加新操作,但添加新案例需要修改所有现有函数。

  • 如果您来自 OOP 背景,这可能看起来很奇怪。在讨论 OOP 中的类时,每个人都强调需要可扩展性(通过添加新类)。在实践中,我认为你需要两者 - 所以你选择哪个方向并不重要。 FP 有它的好处,就像 OOP 一样(有时)。

    当然,这是一个完全没用的例子。有关这在实践中如何有用的更现实的讨论,请参阅 Scott Wlaschin 的优秀 Designing with Types series .

    关于.net - 什么是 F# 中的可区分联合以及我们在 OOP 中有什么类型的替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60479305/

    相关文章:

    .net - 如何验证 F# 代码是否符合 CLS

    .net - 在定义的目录中加载具有所需引用的程序集

    c# - 了解连接字符串属性

    haskell - 如何在 Haskell 中对系统随时间的变化进行建模

    json - 如何使 F# JSON 类型提供程序示例可用于测试项目?

    list - F# 创建用于比较包含列表的两个列表的函数

    .net - 有没有办法使用.NET SPARK更改导出文件名?

    c# - InvalidCastException 长到 ulong

    functional-programming - "Stacking"函数式语言中的有效函数 - DrRacket

    Javascript - 如何将原始对象传递给回调函数