介绍#
什么是光学?#
光学是一种描述数据结构中的"路径"的方式,即集中关注数据结构的一部分。这被称为光学的焦点。然而,光学并不绑定到数据结构的任何特定值,而是自身的独立值。
光学是可组合的,意味着你可以将两个光学组合在一起构造出另一个光学,该光学结合了前两者的语义。这使得可以从基本光学构造复杂的光学,使它们适用于各种不同的数据结构。
最终,光学可以用于从与光学兼容的给定数据结构中读取其焦点中的值。它也可以用于以_不可变_的方式修改其焦点中的值,即保持原始数据结构不变。
光学的类型#
optics-ts支持的光学类型有等价性(Equivalence)、同构(Iso)、镜头(Lens)、棱镜(Prism)、遍历(Traversal)、获取器(Getter)、仿射折叠(AffineFold)、折叠(Fold)和设置器(Setter)。此外,还有可移除棱镜(RemovablePrism),这是棱镜的一个特例。
这些类型主要在它们可能有的焦点数量以及它们是读/写、只读还是只写上有所不同。下表总结了这些属性:
类型 | 焦点 | 读/写 |
---|---|---|
等价性(Equivalence) | 1 | R/W |
同构(Iso) | 1 | R/W |
镜头(Lens) | 1 | R/W |
棱镜(Prism) | 0..1 | R/W |
可移除棱镜(RemovablePrism) | 0..1 | R/W |
遍历(Traversal) | 0..n | R/W |
获取器(Getter) | 1 | R |
仿射折叠(AffineFold) | 0..1 | R |
折叠(Fold) | 0..n | R |
设置器(Setter) | 1 | W |
组合规则#
任何读/写和只读光学都可以与另一个读/写和只读光学组合。可以从这个图表中确定结果光学的类型:
等价性(Equivalence) -> 同构(Iso) -> 镜头(Lens) ---> 棱镜(Prism) ------> 遍历(Traversal)
| | |
v v v
获取器(Getter) -> 仿射折叠(AffineFold) -> 折叠(Fold)
当你组合两个光学A和B时,结果是从A和B开始沿着箭头得到的最近的光学。
例如,将获取器(Getter)与遍历(Traversal)组合会得到一个折叠(Fold)。将同构(Iso)与棱镜(Prism)组合会得到一个棱镜(Prism)。
设置器(Setter)是特殊的。你只能将可写光学与设置器(Setter)组合。设置器不能与任何其他光学进一步组合。
可移除棱镜(RemovablePrism)的行为像一个常规棱镜,但它可以用来从其父容器中移除焦点。当与其他光学组合时,像(并变回)一个常规棱镜。