我想創建一個模板哈斯克爾功能使得:Haskell:如何判斷一個類是否是類的一個實例?
$(isInstanceOf ''Read ''SomeType)
將導致True
如果SomeType
是任Read
一個實例,False
否則。
我試着看看reify
的結果,我想我正在尋找ClassI
構造函數的內容,但文檔有點缺乏,我無法破譯我需要的東西。有人可以提供指導,瞭解在何處尋找創建上述功能所需的數據?
我想創建一個模板哈斯克爾功能使得:Haskell:如何判斷一個類是否是類的一個實例?
$(isInstanceOf ''Read ''SomeType)
將導致True
如果SomeType
是任Read
一個實例,False
否則。
我試着看看reify
的結果,我想我正在尋找ClassI
構造函數的內容,但文檔有點缺乏,我無法破譯我需要的東西。有人可以提供指導,瞭解在何處尋找創建上述功能所需的數據?
模板Haskell已經提供了a function那差不多你想要什麼。它是2.5版本以前的版本,在此之前我根本沒有意識到有任何方法可以查找實例。
所不同的是,現有的isClassInstance
功能需要一個Name
的類 - 這是你從像''Read
- 但一個Type
得到什麼,以尋找與實例。這可能更有意義,因爲使用Name
沒有明顯的方法來檢查需要類型參數的實例。例如,您將無法直接檢查[Int]
是否有Show
實例,或者Either String
是否爲Monad
實例。
請注意,Type
可以使用一個引號,例如與Name
幾乎一樣容易地構建。你可以寫一些像$(isInstanceOf ''Monad [t| Either String |])
的東西。
鑑於上述情況,您所要做的只是從拼接中返回一個有用的值,無論您希望如此。