在 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