ماذا يعني هذا 'متغير نوع غامض 'أ' في القيد ' يعني?

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

  •  27-10-2019
  •  | 
  •  

سؤال

في هذا الرمز أحاول أن يكون المعلمة الأولى في وظيفة عامل بلدي go كن نوع عائلة.أرى ذلك في النوع النوع وثائق العائلات مماثلة insert تنتمي الوظيفة إلى فئة النوع ، بينما في المثال أدناه لا تنتمي.

أنا جديد في كتابة العائلات ، لذا ربما أستخدمها بشكل خاطئ, ولكن ماذا يعني هذا الخطأ?

{-# LANGUAGE TypeFamilies #-}

-- | key
class K a where
  -- | iterator for key
  type I a :: *
  mkI :: a -> I a

--| A map
data (K a) => M a b = M a b

insert :: (K a) => a -> b -> M a b -> M a b
insert = go mkI    -- <<< PROBLEM
  where
    go o a b m = m

متغير نوع غامض ' أ ' في القيد:

`K a'

  arising from an expression type signature at Data/Map2.hs:167:10-33

الإصلاح المحتمل:أضف توقيع نوع يعمل على الإصلاح متغير(متغيرات)النوع هذا

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

المحلول

هذا يجمع:

{-# LANGUAGE TypeFamilies, GADTs, ScopedTypeVariables #-}

-- | key
class K a where
  -- | iterator for key
  type I a :: *
  mkI :: a -> I a

-- | A map
data M x y where
    M :: K a => a -> b -> M a b

insert :: forall a b. (K a) => a -> b -> M a b -> M a b
insert = go mkI
  where
    go :: (a -> I a) -> a -> b -> M a b -> M a b
    go o a b m = m

ماذا تغيرت ولماذا?

أولا ، افترضت أنك تريد القيد على M, ، لذلك استخدمت شكلا من أشكال تعريف النوع الذي يفرض القيد ويجعله متاحا في مواقع الاستخدام ، أ GADT.

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

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