টেমপ্লেট হাস্কেল কোনও প্রকার শ্রেণিতে ঘোষিত সম্পর্কিত ধরণের প্রতিশব্দগুলির নাম এবং / বা ঘোষণাগুলি জানতে পারে? আমি প্রত্যাশা 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?