Расскажите, пожалуйста, про них.
Мне не ясно, как они удерживают в поле зрения объект целиком.
Я пытался попытать ИИ:
Термин «функциональные линзы» (или просто линзы) пришел из математики (теория категорий) и стал популярен в функциональном программировании.
Линзы решают фундаментальную проблему функционального программирования — доступ к данным без мутаций. Они позволяют писать код, который:
- Декларативен: программист говорит ЧТО изменить (почтовый индекс пользователя), а не КАК (скопируй юзера, потом скопируй адрес, потом...).
- Композируем: Маленькие линзы (город, улица) собираются в большие (адрес целиком).
- Типобезопасен: Если удалить поле из модели, линза сломается на этапе компиляции, а не в рантайме.
Линза — это композиция двух функций для конкретного поля:
Getter (view): Функция, которая достает значение поля из структуры.
Setter (set/over): Функция, которая берет структуру и новое значение, и возвращает новую структуру с измененным полем.
Объединив их в пару, мы получаем линзу: объект, который «смотрит» в конкретную часть данных (фокус).
Основные операции:
view: Посмотреть, что лежит в фокусе (просто получить значение)
set: Положить новое значение (Вернет новый объект с измененным полем
over: Применить функцию к значению в фокусе.
Кроме линз есть целое семейство оптических инструментов (optics).
Линза — это просто «глаз», который смотрит в поле структуры.
Призмы (Prism) умеет «пробовать» достать данные, а если их нет — ничего не делать или переключиться на другой путь. Работают с типами-суммами (например, Maybe, Either или своими вариантами).
Траверсалы (Traversal) позволяют фокусироваться сразу на нескольких элементах внутри структуры (например, на всех элементах списка, на всех значениях в Map, на всех полях определенного типа в записи).
Индексированные оптики (Indexed Optics) позволяют при фокусировке на элементе коллекции также получать его индекс/ключ.
Изо (Iso) представляют собой взаимно-однозначное преобразование между типами, которое можно обратить.
композиция оптик — их все можно соединять друг с другом.
Комбинаторная логика - это система, эквивалентная лямбда-исчислению (по выразительной силе), но в ней нет переменных и связывания (лямбда-абстракции). Она использует базовые комбинаторы (например, S, K, I - подстановки, константы, идентичность).
Но ничего не понял, из того, что он там понаписал.
Что я хочу сделать: я хочу загрузить файл в память, распарсить его, а затем некоторые части заменить (например некоторые слова выделить жирным в HTML-тексте), после чего весь модифицированный файл сохранить.
Если примеры, то мне на Java будет понятнее всего.










