在 getter 和 setter 期间使用访问外部类型组合镜头
Compose lenses with accessing outer type during getter and setter
假设我有一个函数,它使用外部值中的其他内部值提取一些内部值
func :: outer -> inner1 -> inner2
然后我有一个函数,它使用这个 inner2 值在外部值和其他值之间创建一个透镜
existingLensFunc :: inner2 -> Lens' outer result
有没有办法创建另一个函数,使用 inner1 值在外部值和结果值之间创建一个透镜?
finalLens :: inner1 -> Lens' outer result
换句话说,有没有更好的写法?
finalLens inner1 = lens getter setter
where setter outer result = let inner2 = func outer inner1 in set (existingLens inner2) result outer
getter outer = let inner2 = func outer inner1 in view (existingLens inner2) outer
让我们缩短类型...
existingLensFunc
:: Inner2 -> (∀ f . Functor f => (Result -> f Result) -> Outer -> f Outer)
≡ ∀ f . Functor f => Inner2 -> (Result -> f Result) -> Outer -> f Outer
finalLens
:: ∀ f . Functor f => Inner1 -> (Result -> f Result) -> Outer -> f Outer
这里有一个明显的地方可以“抓住”Outer
:来自最后一个参数。
finalLens inner1 fres outer = existingLensFunc (func outer inner1) fres outer
假设我有一个函数,它使用外部值中的其他内部值提取一些内部值
func :: outer -> inner1 -> inner2
然后我有一个函数,它使用这个 inner2 值在外部值和其他值之间创建一个透镜
existingLensFunc :: inner2 -> Lens' outer result
有没有办法创建另一个函数,使用 inner1 值在外部值和结果值之间创建一个透镜?
finalLens :: inner1 -> Lens' outer result
换句话说,有没有更好的写法?
finalLens inner1 = lens getter setter
where setter outer result = let inner2 = func outer inner1 in set (existingLens inner2) result outer
getter outer = let inner2 = func outer inner1 in view (existingLens inner2) outer
让我们缩短类型...
existingLensFunc
:: Inner2 -> (∀ f . Functor f => (Result -> f Result) -> Outer -> f Outer)
≡ ∀ f . Functor f => Inner2 -> (Result -> f Result) -> Outer -> f Outer
finalLens
:: ∀ f . Functor f => Inner1 -> (Result -> f Result) -> Outer -> f Outer
这里有一个明显的地方可以“抓住”Outer
:来自最后一个参数。
finalLens inner1 fres outer = existingLensFunc (func outer inner1) fres outer