У меня есть понятие схемы. Это объект, описывающий, какие у объекта есть поля и как он лежит в памяти, а-ля класс. Экземпляры — либо структуры Struct<Schema>, либо частичные структуры (не со всеми полями) PartialStruct<Schema>.
Дженерики<тип схемы, тип структуры, тип значения, описатель типа значения>.
Тип структуры нужен, чтобы описать, что определённая линза существует только для какого-нибудь частного случая (PrimaryKeyLens имеет смысл только на Record, подтипа Struct, хранимого в БД).
Описатель типа — штука про хранение. Там sealed class из вариантов — простой тип, коллекция, структура.
мне кажется, я настолько в жёпе, что либо писать вопрос на SO, либо придумывать, как переделать, пусть менее правильно и с рантаймовыми проверками, но чтобы хоть компилилось