টেমপ্লেট হাস্কেলের সাথে সম্পর্কিত ধরণের প্রতিশব্দ পাওয়া


257

টেমপ্লেট হাস্কেল কোনও প্রকার শ্রেণিতে ঘোষিত সম্পর্কিত ধরণের প্রতিশব্দগুলির নাম এবং / বা ঘোষণাগুলি জানতে পারে? আমি প্রত্যাশা 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 পরীক্ষা করে দেখিনি। * তবে আমি ধারণা করি এটি সেখানে উপস্থিত ছিল।) আমি জিএইচসি-র যে কোনও সংস্করণের সমাধান করতে আগ্রহী (এটি "কেবলমাত্র জিএইচসি সংস্করণ ভিতে সংশোধন করা হয়েছিল" সহ )।


2
আপনি কি তাকিয়েছেন reifyInstances?
Kwarrtz

2
@ কাওয়ার্টজ: আমি এখনই এটি চেষ্টা করেছি। এটি কাজ করে না, যদিও; এটি কেবল InstanceDযেমনটি আমি দেখেছি ঠিক তেমন উত্থান দেয় reify: putStrLn $(stringE . show =<< reifyInstances ''C' =<< sequence [[t|[Int]|]])মূল্যায়ন করে [InstanceD [] (AppT (ConT Ghci1.C') (AppT ListT (VarT a_1627405978))) []], যা ধরণের পারিবারিক উদাহরণগুলির অভাব রয়েছে।
আন্টাল স্পেক্টর-জাবুস্কি

1
আমি এটি অদ্ভুত বলে reifyমনে করি যা প্রয়োজনীয় তথ্য ফেরত দেয় না। সম্ভবত showকিছু তথ্য লুকিয়ে রাখছে? আপনি কি Infoসরাসরি বস্তুটি পরীক্ষা করার চেষ্টা করেছেন ?
Kwarrtz

@Kwarrtz: আমি ভীত 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) আমি একমত যে এটি অদ্ভুত; সে কারণেই আমি এই প্রশ্নটি জিজ্ঞাসা করেছি :-)
আন্টাল স্পেক্টর-জাবুস্কি

1
@Abel: আমি মনে করি আমরা হিংসাত্মক চুক্তিতে গেছে - আপনার মূল মন্তব্য বলেন, এটি একটি উজ্জ্বল ধারণা আকৃষ্ট করতে যথেষ্ট ছিল না, কিন্তু এটা করেনি Yuras এর উত্তর আকর্ষণ! আমি একটি ভাল উত্তর কি সম্পর্কে সম্পূর্ণ একমত :-)
আন্টাল স্পেক্টর-জাবুসকি

উত্তর:


15

এটি প্রয়োগ করা হয়নি কারণ কেউ এটি অনুরোধ করেনি।

অদ্ভুত বিষয়টি হ'ল TH তার নিজস্ব এএসটি ব্যবহার করে, যা অভ্যন্তরীণ সংকলকটির এসটি অনুসরণ করে না। ফলস্বরূপ, কোনও নতুন বৈশিষ্ট্য (যেমন সম্পর্কিত ধরণের পরিবার) TH এর মাধ্যমে স্বয়ংক্রিয়ভাবে উপলব্ধ হয় না। কারও কারও টিকিট খুলে তা বাস্তবায়ন করতে হবে।

রেফারেন্সের জন্য: অভ্যন্তরীণ reifyClassফাংশন সম্পর্কিত ধরণের পরিবারগুলিকে উপেক্ষা করে (এটি টিপলের ফিরে আসা 5 তম উপাদান, এর classExtraBigSigসংজ্ঞাও দেখুন ClassATItem))

প্রযুক্তিগতভাবে এটি সম্পর্কিত ধরণের পারিবারিক সমর্থন কার্যকর করা সহজ হওয়া উচিত reify, তবে সম্ভবত এটির জন্য এইচআইপি এ পিছনে অসম্পূর্ণ পরিবর্তন প্রয়োজন হবে, উদাহরণস্বরূপ কারণ এটির এএসটি সম্পর্কিত ধরণের ডিফল্ট সমর্থন করে না বলে মনে হয়।

যোগ করা হয়েছে: এটি এখন বাস্তবায়িত হয়েছে (এপিআই পরিবর্তন বিটিডাব্লু ছাড়াই) এবং সম্ভবত পরবর্তী ghcপ্রকাশে উপলভ্য হবে ।


1
@ আন্টালস-জেড এর অর্থ হ'ল সংযুক্ত প্রকারের প্রতিশব্দ ডিফল্টFamilyD সমর্থন করে না । আপনি সম্ভবত সেগুলি ব্যবহার করছেন না, তবে সম্পূর্ণ সমাধানের জন্য API পরিবর্তন প্রয়োজন হতে পারে।
ইউরোস

5
@ আবেল, অবধি অবধি অবধি খোলা রেখেও উত্তরের উত্তরগুলি ভোট আকর্ষণ করতে সহায়তা করে, সুতরাং এটির দ্রুত পুরস্কার দেওয়ার চেয়ে ভাল উত্তরের পুরষ্কার করা আরও কার্যকর উপায়।
dfeuer

1
অনুগ্রহের সময়সীমা শেষ হয়ে গেল। # 10891 বাগ রিপোর্টটি সমাধান না হওয়া পর্যন্ত এটিই সেরা (এবং একমাত্র) উত্তর । আপনার উত্তরে বাগ প্রতিবেদনের একটি লিঙ্ক অন্তর্ভুক্ত করা ভাল ধারণা।
আবেল

1
এফওয়াইআই, # 10891 ঠিক করা হয়েছে এবং এটি মার্জ হওয়ার জন্য অপেক্ষা করছে।
sinan

1
@ সুইফটসনমসেক এএফআইএইচসি সিএইচসি দেবগণ এইচআইপি এপিআই না ভেঙে অবাধে অভ্যন্তরীণ এএসটি পরিবর্তন করতে চান। সম্ভবত অন্যান্য কারণও রয়েছে।
ইয়ুরাস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.