lens是“一等公民形式”的“对数据类型的某个局部的引用”
type X = [getter: (a:A) => X ,setter(new_x : X,a : A) => A]
Q: 为什么用函数?
A: 此时函数是一等公民,便于compose
lens可以写成van Laarhoven lens
type Lens a b =
forall f. Funtor f =>
(b -> f b) -> a -> f a
Lens a b是个function 对于所有的Functor f 它接受一个(b-> f b)函数作为参数 返回一个(a->f a)的函数 由于forall,你把f取成Const a 他就是getter,你把f取成Identity 他就是setter
这个形式的好处是 你会发现lens composing就是function composing,你可以直接用(.)来复合两个lens