Skip to content

介绍#

什么是光学?#

光学是一种描述数据结构中的"路径"的方式,即集中关注数据结构的一部分。这被称为光学的焦点。然而,光学并不绑定到数据结构的任何特定值,而是自身的独立值。

光学是可组合的,意味着你可以将两个光学组合在一起构造出另一个光学,该光学结合了前两者的语义。这使得可以从基本光学构造复杂的光学,使它们适用于各种不同的数据结构。

最终,光学可以用于从与光学兼容的给定数据结构中读取其焦点中的值。它也可以用于以_不可变_的方式修改其焦点中的值,即保持原始数据结构不变。

光学的类型#

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)的行为像一个常规棱镜,但它可以用来从其父容器中移除焦点。当与其他光学组合时,像(并变回)一个常规棱镜。