如何非强制性地 return `Maybe` 镜头?

How to non-impredicatively return `Maybe` a lens?

Maybe (Lens' a b) 这样的类型不起作用,因为 Lens' 是 Rank-2 类型,如果没有 -XImpredicativeTypes 就不能包装在类型构造函数中扩展名(GHC 并不真正支持它)。

什么是提供道德上具有类型的函数的最佳类型

foo :: A -> Maybe (Lens' B C)

一种可能性是将 Maybe 推迟到通过的延续

foo' :: ∀ y . A -> (Lens' B C -> y) -> Maybe y

但我不是特别喜欢。

这就是 Control.Lens.Reified 模块的用途。它包含 lens 层次结构的 newtype 包装器。

foo :: A -> Maybe (ReifiedLens' B C)