سؤال

مقدمة:

أثناء التحقق Snoyman "الثابت" المكتبة وجدت نفسي أرغب في مساعدة GHCI (أو أداة أخرى) في اكتشاف الأشياء.

GHCI :info لا يبدو أنه يعمل بشكل جيد مع عوامل النوع والبيانات كما هو الحال مع أنواع "البسيطة":

> :info Maybe
data Maybe a = Nothing | Just a     -- Defined in Data.Maybe
...
> :info Persist.Key Potato -- "Key Potato" defined in example below
data family Persist.Key val     -- Defined in Database.Persist
... (no info on the structure/identity of the actual instance)

يمكن للمرء أن يبحث دائمًا عن المثيل في الكود المصدري ، ولكن في بعض الأحيان قد يكون من الصعب العثور عليه وقد يكون مخفيًا في رمز القالب الذي تم إنشاؤه في الهاسيل وما إلى ذلك.

مثال رمز:

{-# LANGUAGE FlexibleInstances, GeneralizedNewtypeDeriving, MultiParamTypeClasses, TypeFamilies, QuasiQuotes #-}

import qualified Database.Persist as Persist
import Database.Persist.Sqlite as PSqlite

PSqlite.persistSqlite [$persist|
Potato
    name String
    isTasty Bool
    luckyNumber Int
    UniqueId name
|]

ما يجري في مثال الكود أعلاه هو أن القالب-هاسكيل يقوم بإنشاء رمز لنا هنا. جميع الامتدادات أعلاه باستثناء QuasiQuotes مطلوب لأن الكود الذي تم إنشاؤه يستخدمها.

اكتشفت ماذا Persist.Key Potato عن طريق العمل:

-- test.hs:
test = PSqlite.persistSqlite [$persist|
...
-- ghci:
> :l test.hs 
> import Language.Haskell.TH
> import Data.List
> runQ test >>= putStrLn . unlines . filter (isInfixOf "Key Potato") . lines . pprint
    where newtype Database.Persist.Key Potato = PotatoId Int64
type PotatoId = Database.Persist.Key Potato

سؤال:

هل هناك طريقة أسهل للحصول على معلومات حول مثيلات من الأسر وأسر البيانات ، باستخدام GHCI أو أي أداة أخرى؟

هل كانت مفيدة؟

المحلول

يفعل -ddump-splices تبين لك الرمز الذي تم إنشاؤه في هذه الحالة؟

غير ذلك، :browse هل يعطيك معلومات حول مثيلات عائلة البيانات ، ولكن ليس عن أسر النوع.

قد ترغب في تقديم ملف تذكرة GHC - ال :browse يبدو الإخراج مشوهًا ، وقد يتوقع المرء الإبلاغ عن مثيلات عائلة البيانات مثل مثيلات الفصل :info.

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