Възможно ли е да гнездите `at` със сетери?

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


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