我有一個數據類型,其(單)構造包含一個存在性量化類型變量:我可以在類型構造函數中強制存在量化參數嗎?
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
?我
我在這裏使用了一個存在性包裝,因爲事件傳遞給一個'Chan LogEvent'異步記錄它們:一個單獨的線程讀取事件並處理它。我當然最初嘗試使LogEvent類型以其有效負載類型參數化,但之後我沒有獲得任何收益,因爲通道另一端的使用者仍然無法觀察事件的類型。 – insitu
如果消費者需要觀察事件的類型,我會推薦一種代數類型。也就是說,除非它統一處理所有事件,保存一兩個特殊情況,在這種情況下,Typeable可能是正確的 – luqui
是的,但這意味着將LogEvent類型綁定到記錄的事件,這是我想避免的,但顯然不能以延遲:-)這不是庫代碼,所以我不在乎太多,雖然這意味着使日誌模塊依賴於系統的每一個記錄類型,這吸收了一點點... – insitu