2017-01-07 32 views
6

Typ taki jak Maybe (Lens' a b) nie działa, ponieważ Lens' jest pod maską typu Rank-2, który nie może być zawijany w konstruktorze typu bez rozszerzenia -XImpredicativeTypes (co nie jest obsługiwane w GHC).W jaki sposób nieinwestycyjnie zwracać `Może` obiektyw?

Jaki jest więc najlepszy typ dać funkcję, która byłaby moralnie mają typ

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

Możliwość byłoby odroczenie Maybe przeszedł do kontynuacji

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

ale nie wiem szczególnie w tym stylu.

+0

Użyj [ 'ALens'] (https://hackage.haskell.org/package/lens-4.15.1/docs/Control-Lens-Lens.html#t:ALens) może być? –

+0

Istnieje również 'ReifiedLens', który jest zwykłym typem opakowania new.peound a' Lens'. Kiedy oddajesz soczewkę, bardziej efektywne może być użycie "ReifiedLens" niż "ALens", i wydaje się równie wygodne dla konsumenta. –

Odpowiedz

6

Do tego służy moduł Control.Lens.Reified. Zawiera opakowania newtype dla hierarchii lens.

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