Все, что я знаю, это то, что один работает, а другой нет.
Контекст:
У меня есть одна структура данных 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 ради вас.