2015-06-23 3 views
2

У меня есть следующий кодЕсть ли оператор линзы объединить% ~ и БПМЖ

u & currentDay %~ fmap (addDays 1) 

currentDay возвращает Maybe поэтому мне нужно fmap. Есть ли уже оператор для объединения %~ и fmap (например, %~<$> ;-)) или умный способ сделать это?

+0

Как насчет 'u & currentDay% ~ (addDays 1 <$>)'? –

+0

Действительно, но мне интересно узнать, есть ли у оператора в библиотеке объективов. Их так много, и некоторые из них трудно понять. – mb14

+3

Вы можете использовать [сопоставленный] (https://hackage.haskell.org/package/lens-4.11/docs/Control-Lens-Setter.html#v:mapped): 'u & currentDay. отображено% ~ addDays 1' – cchalmers

ответ

2

Там нет существующего оператора для этого, но вы можете легко определить свой собственный:

%$~ :: Functor f => ASetter s t (f a) (f b) -> (a -> b) -> s -> t 
l %$~ f = over a (fmap f) 

Стандартный способ сделать это состоит в использовании mapped сеттера:

u & currentDay . mapped %~ addDays 1 

С вашего отображения над a Maybe Вы также можете использовать _Just призму:

u & currentDay . _Just %~ addDays 1