У меня есть тип данных которого (один) Конструктор содержит экзистенциально количественный переменную типа:Могу ли я принудить экзистенциально квантифицированный аргумент в конструкторе типа?
data LogEvent = forall a . ToJSON a =>
LogEvent { logTimestamp :: Date
, logEventCategory :: Category
, logEventLevel :: LogLevel
, logThreadId :: ThreadId
, logPayload :: a
}
Когда я писал, что тип изначально я скрывал полиморфную полезную нагрузку, потому что все, что я был заинтересован в то время было вывод некоторых файл/поток. Но теперь я хочу сделать более интересные вещи, для которых мне нужно наблюдать фактический тип a
.
Я понимаю, от this question и других показаний, которые экзистенциально количественных переменных типа являются уникальными по каждой конкретизации. Тем не менее, данный тип ToJSON a
я могу что-то вроде следующего (псевдо-код):
let x :: Result Foo = fromJSON $ toJSON (logPayload event)
Это кажется странным, чтобы иметь возможность конвертировать и из JSON с более точным типом, хотя я могу понять объяснение позади что.
Так как я могу переписать этот тип, чтобы извлечь logPayload
, если я знаю, что его тип? I
Здесь я использую экзистенциальную оболочку, потому что события передаются через 'Chan LogEvent' для асинхронного ведения журнала: отдельный поток читает событие и обрабатывает его. Я, конечно, изначально попытался создать тип LogEvent с параметром полезной нагрузки, но потом ничего не получаю, потому что потребитель на другом конце канала все еще не может наблюдать тип события. – insitu
Если потребитель должен соблюдать тип события, я бы рекомендовал алгебраический тип. То есть, если он не обрабатывает все события равномерно, сохраняя специальный случай или два, в этом случае Typeable, вероятно, прав – luqui
Да, но это означает привязку типа LogEvent к зарегистрированным событиям, чего я хотел избежать, но, очевидно, не сможет чтобы отложить больше :-) Это не библиотечный код, поэтому мне все равно, хотя это означает, что модуль журнала зависит от каждого зарегистрированного типа системы, что немного засасывает ... – insitu