Мне нравится библиотека Lens, и мне нравится, как она работает, но иногда она вводит столько проблем, что я сожалею, что когда-либо начал ее использовать. Давайте рассмотрим этот простой пример:
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
data Data = A { _x :: String, _y :: String }
| B { _x :: String }
makeLenses ''Data
main = do
let b = B "x"
print $ view y b
выводится:
""
А теперь представьте себе - у нас есть тип данных, и мы реорганизуем его - путем изменения некоторых имен. Вместо того, чтобы получать ошибку (во время выполнения, например, с обычными аксессуарами), что это имя больше не применяется к конкретному конструктору данных, объективы используют mempty
из Monoid
для создания объекта по умолчанию, поэтому мы получаем странные результаты вместо ошибки. Отладка чего-то подобного почти невозможна.
Есть ли способ исправить это поведение? Я знаю, что есть некоторые специальные операторы, чтобы получить поведение, которое я хочу, но все "нормальные" функции от объективов просто ужасны. Должен ли я просто переопределять их с помощью моего настраиваемого модуля или есть ли более удобный метод?
В качестве побочного элемента: я хочу иметь возможность читать и устанавливать аргументы с использованием синтаксиса объектива, но просто удалять поведение автоматического создания результата, когда поле отсутствует.