Я знаю, что для типов данных, которые выводят 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?