2013-04-02 4 views
9

Я использую пакет объективов и продолжаю думать, что должно быть легкое решение следующей проблемы. Скажем, у меня есть карта (или любой At экземпляр) и объектив на его тип значения, т.е.Составление частичных геттеров с использованием библиотеки объективов

aMap :: Map Int a 
aLens :: Simple Lens a b 

Я хочу геттер

g :: Getter (Map Int a) (Maybe b) 

Это потому, что я часто хочу сделать что-то вроде этого

x :: Maybe b 
x = aMap^.at 3.g.aLens 

Намеченные семантика, конечно, в том, что вы получаете значение Just когда вы делаете это в at поиска и Nothing иначе.

Когда один устанавливает вместо того, чтобы traverse работы вместо g, т.е.

newMap = at 3.traverse.aLens .~ whatever $ aMap 

, но не тогда, когда вы получаете. Есть ли готовые встроенные линзы в библиотеке, которую я просто пропустил, или есть еще один простой способ добиться этого в одном выражении?

ответ

4

У меня возникла аналогичная проблема, пытаясь скомпоновать линзы с at.

Если вам не нужно поведение вставки/удаления at здесь, как насчет использования ix?

x :: Maybe b 
x = aMap ^? ix 3 . aLens 
3

мне удалось придумать

x :: Maybe b 
x = aMap^.at 3 <&> (^.aLens) 

который немного сбивает с толку и не точно то, что я искал, но получает работу.

 Смежные вопросы

  • Нет связанных вопросов^_^