Я пытаюсь выполнить манипуляцию с вложенной структурой данных, содержащей списки элементов. Повозившись с различными подходами, я наконец остановился на линзах, как на лучшем способе сделать это. Они отлично работают для поиска и изменения определенных элементов структуры, но пока я в тупике, как добавлять новые элементы.
Из того, что я прочитал, я технически не могу использовать обход, поскольку он нарушает законы обхода для вставки нового элемента в список, и это предполагает, что я даже могу понять, как это сделать с помощью обхода в первую очередь ( Я все еще довольно слаб с Haskell, и подписи типов для большинства вещей в упаковке объектива вызывают у меня головокружение).
В частности, я пытаюсь выполнить следующее: найти какой-либо элемент в списке элементов, который соответствует определенному селектору, а затем вставить новый элемент либо до, либо после соответствующего элемента (другой аргумент функции либо до, либо после совпадение). Есть ли в Control.Lens уже что-то, что может выполнить то, что я пытаюсь сделать, и мое понимание сигнатур типов слишком слабое, чтобы увидеть это? Есть ли лучший способ выполнить то, что я пытаюсь сделать?
Было бы довольно тривиально, если бы я просто пытался добавить новый элемент либо в начало, либо в конец списка, но вставка его в какое-то конкретное место в середине — сложная часть. В некоторых написанных мной кодах перед линзами я использовал сгиб для достижения того, что хотел, но он начинал становиться неуклюжим в более глубоко вложенных частях структуры (например, сгиб внутри сгиба внутри сгиба), поэтому Я обратился к Control.Lens, чтобы попытаться разобраться в этом беспорядке.