У меня есть тип данных, чей (единственный) конструктор содержит экзистенциально квантифицированную переменную типа:
data LogEvent = forall a . ToJSON a =>
LogEvent { logTimestamp :: Date
, logEventCategory :: Category
, logEventLevel :: LogLevel
, logThreadId :: ThreadId
, logPayload :: a
}
Когда я изначально писал этот тип, я спрятал полиморфную полезную нагрузку, потому что все, что меня интересовало в то время, это вывод в какой-то файл/поток. Но теперь я хочу заняться более интересными вещами, для которых мне нужно наблюдать за фактическим типом a
.
Я понимаю из этот вопрос и другие чтения, которые экзистенциально квантифицируют переменные типа, уникальны при каждом экземпляре. Однако, если задан тип ToJSON a
, я могу сделать что-то вроде следующего (псевдокод):
let x :: Result Foo = fromJSON $ toJSON (logPayload event)
Кажется странным иметь возможность конвертировать в JSON и обратно с более точным типом, хотя я могу понять причину этого.
Итак, как я могу переписать этот тип, чтобы позволить извлекать logPayload
, если я знаю его тип? я