F#中被歧视联盟的含义

him*_*ami 1 f# discriminated-union

我确实理解他们独立情境中"歧视"和"联合"的含义,但我对F#的"被歧视的联盟"感到茫然.

Fyi,英语不是我的第一语言,我也不擅长数学.所以我希望那里的人可以了解F#的这个特性.请.

我需要知道的是:

  • 这个受歧视的联盟的用例.它通常用于什么?
  • 它等同于其他OOP功能/术语.如果有的话.
  • 是否像我们使用维恩图来表示数据的设置操作?

或者你可以帮我指点链接.

mol*_*ilo 8

一个有区别的联盟是两个联合体,你可以分辨出一个项目最初属于哪个集合; 即使它们是相同的东西,你也可以区分它们,即分开它们.

例如,如果你有两组整数的区别联合,两者都包含数字2,你可以区分2s,因为你知道它来自哪个原始集.

例如,考虑二维平面中的点.

这些可以用两种方式表示为一对实数,使用矩形(或笛卡尔)坐标(x coordinate, y coordinate)或使用极坐标(angle of rotation, distance).

但如果有人给你一对数字,你就不会知道它们是什么意思.

但是,我们可以形成一个有区别的联盟:

type Point2D = 
    | Rectangular of real * real
    | Polar of real * real
Run Code Online (Sandbox Code Playgroud)

现在任何Point2D值都可以使预期的解释清晰,编译器可以确保我们不会尝试混合表示或无法处理案例.

在OO设置中,您将使用抽象基类构建类层次结构,或者具有可以检查的"种类"成员.

但是,形成不同类型的联合会更为常见 - 如果你为编程语言编写了一个解释器,你可能会看到类似的东西.

type Expression = 
    | Integer of int
    | String of string
    | Identifier of string
    | Operator of string
    | Conditional of Expression * Expression * Expression
    | Definition of string * Expression
Run Code Online (Sandbox Code Playgroud)

等等.

受歧视的联合也称为"和类型",元组称为"产品类型".
这些术语来自类型代数学科,结果类型称为"代数数据类型".
(当功能程序员提到"ADT"时,"A"通常用于"代数",而不是"抽象".)