2012-01-01 76 views
3

我想創建一個模板哈斯克爾功能使得:Haskell:如何判斷一個類是否是類的一個實例?

$(isInstanceOf ''Read ''SomeType) 

將導致True如果SomeType是任Read一個實例,False否則。

我試着看看reify的結果,我想我正在尋找ClassI構造函數的內容,但文檔有點缺乏,我無法破譯我需要的東西。有人可以提供指導,瞭解在何處尋找創建上述功能所需的數據?

回答

3

模板Haskell已經提供了a function差不多你想要什麼。它是2.5版本以前的版本,在此之前我根本沒有意識到有任何方法可以查找實例。

所不同的是,現有的isClassInstance功能需要一個Name的類 - 這是你從像''Read - 但一個Type得到什麼,以尋找與實例。這可能更有意義,因爲使用Name沒有明顯的方法來檢查需要類型參數的實例。例如,您將無法直接檢查[Int]是否有Show實例,或者Either String是否爲Monad實例。

請注意,Type可以使用一個引號,例如與Name幾乎一樣容易地構建。你可以寫一些像$(isInstanceOf ''Monad [t| Either String |])的東西。

鑑於上述情況,您所要做的只是從拼接中返回一個有用的值,無論您希望如此。

相關問題