Я использую пакет объективов и продолжаю думать, что должно быть легкое решение следующей проблемы. Скажем, у меня есть карта (или любой 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
, но не тогда, когда вы получаете. Есть ли готовые встроенные линзы в библиотеке, которую я просто пропустил, или есть еще один простой способ добиться этого в одном выражении?