0Pricing
TypeScript Academy · درس

نمط HKT خفيف الوزن

طبّقوا حيلة إزالة دالة Kind/URI

نمط HKT خفيف الوزن درس مجاني في TypeScript Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في TypeScript Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

إزالة التوظيف

للحيلة الكامنة وراء الترميز اسم هو: إزالة التوظيف (defunctionalization). فبدلًا من استخدام دالة نوع حقيقية من الرتبة العليا، نمثّل كل دالة بوسم ونحلّها عبر عملية بحث واحدة من الرتبة الأولى. وسجل URItoKind هو جدول البحث هذا.

type Kind<F extends URIS, A> = URItoKind<A>[F];
// One lookup replaces true type-function application

نوع Kind

Kind<F, A> هو الواجهة العامة لهذا النمط. اقرأوه بمعنى «المنشئ F مطبّق على A». فهو يخفي فهرسة السجل خلف اسم واضح.

type A = Kind<"Array", number>;  // number[]
type B = Kind<"Option", string>; // string | null

تقييد F إلى URIS

يجب أن يكون F URI مسجّلًا. قيّدوه باستخدام extends URIS بحيث لا يمكن استخدام إلا الوسوم الصالحة، وتتحول الأخطاء الإملائية إلى أخطاء أثناء الترجمة.

type Kind<F extends URIS, A> = URItoKind<A>[F];

// Kind<"Arrey", number> -> error, not a valid URI

كتابة التواقيع العامة

يمكننا الآن كتابة توقيع Functor الذي كان مستحيلًا سابقًا. استبدلوا كل F<A> بـ Kind<F, A>، وسيقبله المترجم.

interface Functor<F extends URIS> {
  map<A, B>(fa: Kind<F, A>, f: (a: A) => B): Kind<F, B>;
}

التحليل أثناء التنفيذ

عندما تثبّتون F على URI ملموس، يحلّ Kind إلى نوع الحاوية الحقيقي. فـ Functor<"Array"> لديه map تحوّل من A[] إلى B[].

type ArrayFunctor = Functor<"Array">;
// map: <A, B>(fa: A[], f: (a: A) => B) => B[]

معاملات أنواع متعددة

تأخذ بعض المنشئات معاملين، مثل Either<E, A>. ويوسّع fp-ts النمط باستخدام URItoKind2 وKind2<F, E, A> للنوع * -> * -> *. وتتوسع الفكرة بإضافة سجلات أخرى.

interface URItoKind2<E, A> {
  Either: { left: E } | { right: A };
}
type Kind2<F extends URIS2, E, A> = URItoKind2<E, A>[F];

اصطلاح fp-ts

رسّخت fp-ts الاصطلاح الذي يتبعه هذا المقرر بأكمله: سلسلة URI لكل نوع بيانات، وسجل URItoKind موسّع بدمج التصريحات، وKind لعملية الحل. ويسمح لكم التعرّف إليه بقراءة تواقيع الأنواع في fp-ts وEffect.

// In fp-ts you will see exactly:
// declare module "fp-ts/HKT" { interface URItoKind<A> { ... } }

سجل نسخة

«نسخة» التجريد هي قيمة تنفّذه لـ URI محدد. وتحمل النسخة تطبيق map الملموس. سنكتب نسخة Array في الدرس التالي؛ أما هنا فنعرض شكلها.

declare const arrayFunctor: Functor<"Array">;
const out = arrayFunctor.map([1, 2, 3], n => n * 2); // number[]

لماذا يُسمى «خفيفًا»

يُسمى هذا النمط HKT الخفيف لأنه لا يحتاج إلى تعديلات على المترجم أو صياغة خاصة، بل إلى واجهات ووصول مفهرس فحسب. والمقابل هو قدر قليل من الإجراءات الشكلية (URIs والسجلات) للحصول على شيفرة عامة فعلية تعمل مع الحاويات.

type Kind<F extends URIS, A> = URItoKind<A>[F];
// No magic, just a typed lookup table

القيود

النمط مطوّل، وقد تكون رسائل الخطأ غامضة لأنها تشير إلى الترميز بدلًا من مجالكم. كما يتطلب تسجيل كل حاوية. وفي معظم التطبيقات، تستهلكون مكتبات تنفّذ ذلك مسبقًا بدلًا من بنائه بأنفسكم.

// Trade-off: real abstraction power vs. encoding ceremony

جمع المكوّنات

الوصفة الكاملة لـ HKT الخفيف هي: تعريف URI، وتسجيله في URItoKind، وتعريف التجريدات باستخدام Kind<F, A>، وتوفير نسخ لكل URI. هذه هي مجموعة الأدوات الكاملة التي تقف وراء المكتبات الوظيفية العامة في TypeScript.

type Kind<F extends URIS, A> = URItoKind<A>[F];
interface Functor<F extends URIS> {
  map<A, B>(fa: Kind<F, A>, f: (a: A) => B): Kind<F, B>;
}

تحقق سريع

اختبروا مدى فهمكم لنمط HKT الخفيف.

مراجعة

جمعتم مكوّنات نمط HKT الخفيف.

  • تستبدل إزالة التوظيف تطبيق دالة النوع بعملية بحث.
  • يحلّ Kind<F, A> URI والوسيط إلى نوع ملموس.
  • تستخدم التواقيع العامة Kind بدلًا من F<A>.
  • يتوسع النمط ليشمل معاملين عبر Kind2، وهو اصطلاح fp-ts.

التالي: map عامة مع نسخ فعلية.

الأسئلة الشائعة

هل درس «نمط HKT خفيف الوزن» مجاني؟

نعم — نص درس «نمط HKT خفيف الوزن» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة TypeScript Academy، انتقل إلى CoddyKit PRO. تتضمن دورة TypeScript Academy 4 دروس في المجموع.

ماذا ستتعلم في «نمط HKT خفيف الوزن»؟

طبّقوا حيلة إزالة دالة Kind/URI تتمرن على TypeScript Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ TypeScript Academy؟

لا تُشترط خبرة سابقة. TypeScript Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «نمط HKT خفيف الوزن»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس TypeScript Academy هذا؟

نعم. كل درس في TypeScript Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. مشكلة HKT في TypeScript
  2. تعريف مُنشئات الأنواع
  3. نمط HKT خفيف الوزن
  4. Functors وMappers العامة
← العودة إلى TypeScript Academy