Все, что я знаю, это то, что один работает, а другой нет.
Контекст:
У меня есть одна структура данных F
, которая содержит Data.Map.Map k S
для другой структуры данных S
. Моя цель состояла в том, чтобы построить Lens
, который дал бы F
и k
описал бы поле в S
.
Трудность состоит в том, что ключ k
может отсутствовать на карте. Это прекрасно, что функция может обернуть его возвращение в Maybe. Однако я не мог распространять объектив через "Maybe", используя at
. Прочитав много ответов на переполнение стека, я столкнулся с этим.
Оказывается, что замена at
на ix
решла мои проблемы типа, если я также заменил (^.)
на (^?)
.
Вопрос:
Похоже, что at
и ix
делают то же самое, по крайней мере, в отношении Map
. Оба берут ключ и дают "Объектив" для значения на этом ключе. Тем не менее, ix
, похоже, хорошо сочетается с оператором композиции функций (.)
. В чем разница между двумя?
Off Topic Rant:
Мне нравятся операторы infix, как и у следующего парня, но пакет Control.Lens, похоже, немного завышен. Для нового пользователя, имеющего несколько английских имен, и ключ где-то будет понижать кривую обучения. Из-за огромного количества классов-оберток, используемых в библиотеке Lens, особенно сложно вырыть сигнатуры типов, если вы еще не знаете, что происходит. Мой код начинает выглядеть как Perl ради вас.