Ответ 1
Вы не можете * превратить (!!)
в любую объектоподобную вещь, отличную от Getter
, но есть функция для выполнения такого рода вещей: ix, для доступа к вещам по индексам. На самом деле это Traversal
, а не Lens
, который здесь означает только то, что он может потерпеть неудачу (если индекс за пределами границ) - но пока индекс находится в списке, он будет работать.
Другая проблема, хотя - (^.)
, также является оператором, который используется исключительно для получения значений. Это несовместимо с, например, (%=)
, который воспринимает линзоподобную вещь как свой первый аргумент. И: (%=)
предназначен для отображения функции над существующим значением; если вы просто хотите установить, вы можете использовать (.=)
. Поэтому вы, вероятно, хотите что-то вроде:
list . ix i . inner .= True
* На самом деле есть функция, которая может это сделать - она называется upon
- но она использует чудесную злую черную магию, и вы не должны ее использовать, по крайней мере, не для этого (и, вероятно, не для какого-либо реального кода).