Я знаю, что для типов данных, которые выводят Data.Data, constrFields дает список имен полей. Глядя на документацию GHC.Generics, я думаю, что то же самое должно быть возможно и для Generic. (но, к сожалению, не смог понять, как это сделать сам).
В частности, я ищу две вещи:
Список всех полей записи
... в рамках программы Haskell. Я знал, что aeson способен автоматически выводить JSON-представление любого типа данных записи, которое выводит Generic, но только чтение его исходного кода подтвердил, что я здесь невежественный. Из того, что я могу догадаться, aeson должен иметь возможность получить все имена полей (как String или ByteString s) из типа данных записи, а также их типы (которые имеют тип что-то вроде TypeRep в Data.Typeable или экземпляр Eq: все, что можно использовать для сопоставления блоков case).
Я смутно предполагаю, что создание класса и экземпляров для M1, :*: и т.д. является способом, но я не мог сделать это с помощью проверки типов.
Осмотрите селектор записей
Чтобы получить тип данных записи, к которому он принадлежит, имя поля записи (как String) и т.д.
Например, данный
data Record = Record
{ recordId :: Int32
, recordName :: ByteString
} deriving Generic
Функция magic, которая похожа на
typeOf (Record {}) == typeOf (magic recordId)
Возможно ли это с помощью deriving Generic, или мне нужно обратиться к Template Haskell?