2017-01-07 14 views
6

Тип типа 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 

, но я не особенно подобным.

+0

Используйте [ 'ALens'] (https://hackage.haskell.org/package/lens-4.15.1/docs/Control-Lens-Lens.html#t:ALens) может быть? –

+0

Существует также 'ReifiedLens', который является обычным newtype wrapper.around' Lens'. Когда вы возвращаете объектив, может быть более эффективным использовать «ReifiedLens», чем «ALens», и, похоже, он одинаково удобен для пользователя. –

ответ

6

Это то, что для модуля Control.Lens.Reified. Он содержит обертки newtype для иерархии lens.

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