him*_*ami 1 f# discriminated-union
我确实理解他们独立情境中"歧视"和"联合"的含义,但我对F#的"被歧视的联盟"感到茫然.
Fyi,英语不是我的第一语言,我也不擅长数学.所以我希望那里的人可以了解F#的这个特性.请.
我需要知道的是:
或者你可以帮我指点链接.
一个有区别的联盟是两个联合体,你可以分辨出一个项目最初属于哪个集合; 即使它们是相同的东西,你也可以区分它们,即分开它们.
例如,如果你有两组整数的区别联合,两者都包含数字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"通常用于"代数",而不是"抽象".)