টেমপ্লেট হাস্কেল কোনও প্রকার শ্রেণিতে ঘোষিত সম্পর্কিত ধরণের প্রতিশব্দগুলির নাম এবং / বা ঘোষণাগুলি জানতে পারে? আমি প্রত্যাশা reify
করি আমি যা চাই তা করব তবে এটি সমস্ত প্রয়োজনীয় তথ্য সরবরাহ করবে বলে মনে হয় না। এটি ফাংশনের ধরণের স্বাক্ষর পাওয়ার জন্য কাজ করে:
% ghci
GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help
...
Prelude> -- I'll be inserting line breaks and whitespace for clarity
Prelude> -- in all GHCi output.
Prelude> :set -XTemplateHaskell
Prelude> import Language.Haskell.TH
Prelude Language.Haskell.TH> class C a where f :: a -> Int
Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''C)
ClassI (ClassD [] Ghci1.C [PlainTV a_1627398388] []
[SigD Ghci1.f
(ForallT [PlainTV a_1627398388]
[ClassP Ghci1.C [VarT a_1627398388]]
(AppT (AppT ArrowT (VarT a_1627398388))
(ConT GHC.Types.Int)))])
[]
যাইহোক, শ্রেণীর সাথে সম্পর্কিত ধরণের প্রতিশব্দ যুক্ত করার ফলে আউটপুটে কোনও পরিবর্তন (পুনর্নামকরণ পর্যন্ত) হয় না:
Prelude Language.Haskell.TH> :set -XTypeFamilies
Prelude Language.Haskell.TH> class C' a where type F a :: * ; f' :: a -> Int
Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''C')
ClassI (ClassD [] Ghci3.C' [PlainTV a_1627405973] []
[SigD Ghci3.f'
(ForallT [PlainTV a_1627405973]
[ClassP Ghci3.C' [VarT a_1627405973]]
(AppT (AppT ArrowT (VarT a_1627405973))
(ConT GHC.Types.Int)))])
[]
আমি যদি নামটি জানি তবে F
আমি এটি সম্পর্কে তথ্য সন্ধান করতে পারি:
Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''F)
FamilyI (FamilyD TypeFam
Ghci3.F
[PlainTV a_1627405973]
(Just StarT))
[]
তবে নামটি আমি F
প্রথম স্থানে খুঁজে পাচ্ছি না । এমনকি আমি টাইপ শ্রেণীর উদাহরণ যোগ InstanceD
করলেও সংজ্ঞা সম্পর্কিত কোনও তথ্য নেই:
Prelude Language.Haskell.TH> instance C' [a] where type F [a] = a ; f' = length
Prelude Language.Haskell.TH> f' "Haskell"
7
Prelude Language.Haskell.TH> 42 :: F [Integer]
42
Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''C')
ClassI (ClassD [] Ghci3.C' [PlainTV a_1627405973] []
[SigD Ghci3.f'
(ForallT [PlainTV a_1627405973]
[ClassP Ghci3.C' [VarT a_1627405973]]
(AppT (AppT ArrowT (VarT a_1627405973))
(ConT GHC.Types.Int)))])
[InstanceD []
(AppT (ConT Ghci3.C')
(AppT ListT (VarT a_1627406161)))
[]]
যদি reify
কাজ না করে তবে ম্যানুয়ালি সহযোগী প্রকারের প্রতিশব্দগুলি তালিকাভুক্তকরণ ছাড়া অন্য কোনও কাজ আছে?
এই সমস্যাটি জিএইচসি 7.8.3 এ টেম্পলেট-হ্যাশেল প্যাকেজের সংস্করণ 2.9.0.0 সহ উপস্থিত রয়েছে; এটি টেমপ্লেট-হেস্কেল প্যাকেজের ২.7.০.০ সংস্করণ সহ জিএইচসি .4.৪.২ এ উপস্থিত ছিল। (আমি জিএইচসি .6..6 পরীক্ষা করে দেখিনি। * তবে আমি ধারণা করি এটি সেখানে উপস্থিত ছিল।) আমি জিএইচসি-র যে কোনও সংস্করণের সমাধান করতে আগ্রহী (এটি "কেবলমাত্র জিএইচসি সংস্করণ ভিতে সংশোধন করা হয়েছিল" সহ )।
InstanceD
যেমনটি আমি দেখেছি ঠিক তেমন উত্থান দেয় reify
: putStrLn $(stringE . show =<< reifyInstances ''C' =<< sequence [[t|[Int]|]])
মূল্যায়ন করে [InstanceD [] (AppT (ConT Ghci1.C') (AppT ListT (VarT a_1627405978))) []]
, যা ধরণের পারিবারিক উদাহরণগুলির অভাব রয়েছে।
reify
মনে করি যা প্রয়োজনীয় তথ্য ফেরত দেয় না। সম্ভবত show
কিছু তথ্য লুকিয়ে রাখছে? আপনি কি Info
সরাসরি বস্তুটি পরীক্ষা করার চেষ্টা করেছেন ?
Info
এর Show
উদাহরণ হিসেবে বলা যায় মাত্র এক প্রাপ্ত করা হয়, এবং একই Show
জন্য উদাহরণস্বরূপ Dec
। যাইহোক, আমি সরাসরি পরীক্ষা করতে পারবেন, যেমন আপনাকে জিজ্ঞাসা, এবং কোন: putStrLn $(reify ''C' >>= \i -> case i of ClassI (ClassD _ _ _ _ [SigD _ _]) _ -> stringE "just a SigD" ; _ -> stringE "something else")
উত্পাদন করে just a SigD
- যে সত্যিই একমাত্র জিনিস [Dec]
মধ্যে ClassD
! (প্রয়োজন LambdaCase
) আমি একমত যে এটি অদ্ভুত; সে কারণেই আমি এই প্রশ্নটি জিজ্ঞাসা করেছি :-)
reifyInstances
?