आप टेम्पलेट हास्केल का उपयोग करके दिए गए प्रकार के वर्ग के लिए दायरे में उदाहरण उत्पन्न कर सकते हैं।
import Language.Haskell.TH
-- get a list of instances
getInstances :: Name -> Q [ClassInstance]
getInstances typ = do
ClassI _ instances <- reify typ
return instances
-- convert the list of instances into an Exp so they can be displayed in GHCi
showInstances :: Name -> Q Exp
showInstances typ = do
ins <- getInstances typ
return . LitE . stringL $ show ins
GHCi में यह चल रहा है:
*Main> $(showInstances ''Num)
"[ClassInstance {ci_dfun = GHC.Num.$fNumInteger, ci_tvs = [], ci_cxt = [], ci_cls = GHC.Num.Num, ci_tys = [ConT GHC.Integer.Type.Integer]},ClassInstance {ci_dfun = GHC.Num.$fNumInt, ci_tvs = [], ci_cxt = [], ci_cls = GHC.Num.Num, ci_tys = [ConT GHC.Types.Int]},ClassInstance {ci_dfun = GHC.Float.$fNumFloat, ci_tvs = [], ci_cxt = [], ci_cls = GHC.Num.Num, ci_tys = [ConT GHC.Types.Float]},ClassInstance {ci_dfun = GHC.Float.$fNumDouble, ci_tvs = [], ci_cxt = [], ci_cls = GHC.Num.Num, ci_tys = [ConT GHC.Types.Double]}]"
एक और उपयोगी तकनीक एक दिया प्रकार GHCi का उपयोग कर वर्ग के लिए दायरे में सभी उदाहरणों दिखा रहा है।
Prelude> :info Num
class (Eq a, Show a) => Num a where
(+) :: a -> a -> a
(*) :: a -> a -> a
(-) :: a -> a -> a
negate :: a -> a
abs :: a -> a
signum :: a -> a
fromInteger :: Integer -> a
-- Defined in GHC.Num
instance Num Integer -- Defined in GHC.Num
instance Num Int -- Defined in GHC.Num
instance Num Float -- Defined in GHC.Float
instance Num Double -- Defined in GHC.Float
संपादित करें: पता करने के लिए महत्वपूर्ण बात यह है (या GHCi शीघ्र, आदि में) है कि संकलक किसी भी मॉड्यूल में दायरे में प्रकार वर्गों में से केवल बारे में पता है। इसलिए यदि आप showInstances
TH फ़ंक्शन को बिना किसी आयात के कहते हैं, तो आपको केवल प्रीलूड से उदाहरण मिलेंगे। यदि आपके पास दायरे में अन्य मॉड्यूल हैं, उदा। Data.Word, तो आप उन सभी उदाहरणों को भी देखेंगे।
दरअसल, संकलक नहीं जानता कि कौन से उदाहरण परिभाषित किए गए हैं। एकमात्र चीज यह कर सकती है, यह जांच कर रही है कि एक प्रकार टाइपक्लास का उदाहरण है या नहीं। – fuz