【发布时间】:2015-04-16 19:40:43
【问题描述】:
我有一个数据类型,其(单个)构造函数包含一个存在量化类型变量:
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?我
【问题讨论】:
标签: haskell types gadt existential-type