كيف يمكنني رؤية الإخراج بسهولة من عبارة Haskell القالب؟

StackOverflow https://stackoverflow.com/questions/765902

سؤال

لدي رمز Haskell التالي في الوحدة النمطية الخاصة بي، وهو جزء من تطبيق أكبر.

$(derive makeFoldable ''JStatement)

أظن أن المثيل الذي تم إنشاؤه طوي ليس بالضبط ما كان في اعتبارك أصلا، لكنني لا أستطيع إيجاد طريقة للتحقق من ذلك. لذلك، يفضل استخدام فقط ghci, ، هل من الممكن عرض المثيل الذي تم إنشاؤه؟

جربت ما يلي وحصلت على خطأ في بناء الجملة وأنا أظن أن هذا لأنني أفعل ذلك خطأ ™.

> derive makeFoldable ''JStatement

<interactive>:1:21:
    lexical error in string/character literal at character '\''
هل كانت مفيدة؟

المحلول

اكتشفتها. إذا كنت تمر -ddump-splices سطباعة المثيلات التي تم إنشاؤها إلى المحطة عند تجميع الوحدة.

نصائح أخرى

تقارير GHCI "lexical error..."لأنك ليس لديك قالب Haskell تنشيط في جلسة GHCI الخاصة بك. يمكنك تنشيطه إما عن طريق المرور -XTemplateHaskell في سطر الأوامر أو من داخل GHCI نفسه:

ghci> :set -XTemplateHaskell

بعد تحديد ذلك، يجب عليك الحصول على خطأ في أمثال:

No instance for (Show DecsQ) arising from a use of ‘print’
In a stmt of an interactive GHCi command: print it

الآن، لديك العديد من الخيارات لطباعة الأشياء الموجودة داخل Q مناد:

  • يستخدم -ddump-splices(كما أشار بالفعل في إجابة دنيز دوجان)

  • طباعة جميلة كود Haskell الذي تم إنشاؤه من GHCI نفسه:

    > putStrLn $(stringE . pprint =<< derive makeFoldable ''JStatement)
    instance Foldable (JStatement ...)
      where foldr ... = ...
    
  • إظهار الهيكل الفعلي بناء على المنشئين:

    > putStrLn $(stringE . show =<< derive makeFoldable ''JStatement)
    [InstanceD [] (AppT (ConT Foldable) (... JStatement ...)) [...]]
    

قد يتم تبسيط الاثنين آخرين باستخدام runQ، ولكن هذا لا يعمل من أجل جيل التعليمات البرمجية يستخدم بعض وظائف Haskell القالب، مثل reify عمليات. وهذا يشمل بعض (أو ربما أكثر؟) اشتقاق الحزمة المشتقية.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top