Я хотел бы установить значение на двухуровневой карте, то есть для ключа на карте, который является значением для некоторого ключа на «внешней» карте. Для обычной карты я мог бы использовать что-то вроде m & at 42 ?= "value"
Но я не смог найти способ вложить 2 at
Каков самый простой способ установить такое вложенное значение с помощью объектива?
Можно ли вкладывать `at` с помощью сеттеров?
Ответы (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
Может быть можно использовать
maybe
(или его линзовый аналог)? На данный момент кажется, что явное создание новой подкарты должно выглядеть немного лучше.
- person Qrilka; 04.12.2013