[英]What is Haskell's Data.Typeable?
我遇到過對 Haskell 的Data.Typeable
的引用,但我不清楚為什么要在我的代碼中使用它。
它解決了什么問題,如何解決?
Data.Typeable
是一種眾所周知的方法(參見 Harper)的編碼,用於在靜態類型語言中實現延遲(動態)類型檢查——使用通用類型。
這種類型包裝了類型檢查直到稍后階段才會成功的代碼。 編譯器不會將程序作為錯誤類型拒絕,而是將其傳遞給運行時檢查。
這種風格起源於 Abadi 等人,由 Cheney 和 Hinze 為 Haskell 開發,作為表示所有動態類型的包裝器, Typeable
class 出現在 SPJ 和 Lammel 的 SYB 工作中。
參考
即使在教科書中:動態類型(具有可類型表示)是只有一種類型的靜態類型語言,Harper ch 20:
20.4 無類型意味着單一類型
無類型的 λ 演算可以忠實地嵌入到具有遞歸類型的類型語言中。 這意味着每個無類型的 λ-term 都有一個作為類型化表達式的表示,這樣一個 λ-term 的表示的執行對應於該術語本身的執行。 這種嵌入不是為 ℒ{+×⇀µ} 中的 λ-演算編寫解釋器(我們當然可以這樣做),而是將非類型化 λ-項直接表示為具有遞歸類型的語言中的類型化表達式.
關鍵的觀察是無類型的 λ-演算實際上是單類型的λ-演算! 賦予它強大的不是類型的缺失,而是它只有一種類型,即遞歸類型
D = µt.t → t。
它是一個允許命名類型的庫。 如果類型a
被聲明為Typeable
,那么您可以使用show $ typeOf x
獲取它的名稱,其中x
是類型a
的任何值。 它還具有有限的類型轉換功能。
(這有點類似於 C++ 的 RTTI 或動態語言的反射。)
我能找到的關於 Haskell 的類似Data.Typeable
庫的最早描述之一是 John Peterson 從 1992 年開始的: http://www.cs.yale.edu/publications/techreports/tr1022.Z414EE0975BA419724
我知道的最早介紹實際Data.Typeable
庫的“官方”論文是 2003 年的第一篇 Scrap Your Boilerplate 論文: http://research.microsoft.com/en-us/um/people/simonpj/Papers/hmap/索引.htm
我敢肯定這里有很多人可以參與其中的歷史!
Data.Typeable class 主要用於Scrap Your Boilerplate (SYB) 風格的通用編程。 另請參閱Data.Data
這個想法是 SYB 定義了一個集合組合器,用於在各種用戶創建的類型上以統一的方式執行諸如打印、計數、搜索、替換等操作。 Typeable
類型類提供了必要的管道。
在現代 GHC 中,您可以在定義自己的類型時只說deriving Data.Typeable
以便為其提供必要的實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.