هل يطبق هاسكل سهم الوظيفة على نوع النتيجة فقط؟

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

  •  13-12-2019
  •  | 
  •  

سؤال

هل من الممكن في Haskell تطبيق مُنشئ نوع السهم الوظيفي (->) على نوعه الأيمن فقط (على سبيل المثال:(-> a)) للحصول على مُنشئ النوع * -> *؟

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

المحلول

لا، هذا مستحيل حاليا.هناك بعض القيود على نظام الكتابة الخاص بـ Haskell والذي يسمح له بأن يكون مفيدًا وملائمًا لمعظم الحالات، وهذا أحد تلك القيود.أفضل بديل لك هو استخدام نوع جديد.

newtype FuncFlip r a = FuncFlip { unFuncFlip :: a -> r }

Newtypes هي مجرد علامات لمساعدة المترجم على معرفة كيفية التحقق من الكتابة وتنفيذ الإرسال الموجه للنوع (فئات الكتابة) بشكل صحيح.من المفترض أنك تريد قلب وسيطات الكتابة لتوفير بعض مثيلات فئة الكتابة.هذا يعني فقط أنه عندما تريد الاستفادة من وظائف تلك الفئة، عليك تزيين أي مدخلات محددة بها FuncFlip, ، وقم بإلغاء تزيين أي مخرجات محددة بها unFuncFlip.هذا أكثر إسهابًا قليلاً مما هو مطلوب، لكنه ليس بهذا السوء في الواقع، لأنه يفرض عليك تحديد مثيل فئة الكتابة التي تريد استخدامها بشكل صريح.

يمكنك إنشاء مثيل ل نوع جديد لهذا، والذي قد يكون أو لا يكون مناسبًا لك.

instance Newtype (FuncFlip r a) (a -> r) where
  pack = FuncFlip
  unpack = unFuncFlip

قراءة متعمقة: هل هناك "مجموعات على مستوى النوع؟"

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