ماذا يعني هذا 'متغير نوع غامض 'أ' في القيد ' يعني?
-
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
يجب أن تستخدم ، لذلك علينا أن نقول ذلك.لذلك ، يجب علينا إحضار متغيرات النوع المستخدمة في النطاق ثم إخبار المترجم في التوقيع المحلي بنوع المثيل الذي يجب استخدامه.