Можно ли вкладывать `at` с помощью сеттеров?

Я хотел бы установить значение на двухуровневой карте, то есть для ключа на карте, который является значением для некоторого ключа на «внешней» карте. Для обычной карты я мог бы использовать что-то вроде m & at 42 ?= "value" Но я не смог найти способ вложить 2 at Каков самый простой способ установить такое вложенное значение с помощью объектива?


person Qrilka    schedule 04.12.2013    source источник


Ответы (2)


Люк пользователя показал, что есть более приятное решение - http://juick.com/qrilka/2602819#19 и прямо в библиотеке линз: нет

person Qrilka    schedule 04.12.2013

Типа, мы можем использовать призму _Just, которая не будет работать, если нет доступного ключа. Это имеет неприятный эффект, заключающийся в том, что мы не можем создавать ключи на 2 слоя ниже. Но как пример

at2 :: Ord k => k -> k -> IndexedTraversal' k (Map k (Map k v)) (Maybe v)
at2 k1 k2 = at k1 . _Just . at k2
person Daniel Gratzer    schedule 04.12.2013
comment
Может быть можно использовать maybe (или его линзовый аналог)? На данный момент кажется, что явное создание новой подкарты должно выглядеть немного лучше. - person Qrilka; 04.12.2013