هل DeriveFunctor امتداد معترف به جيدًا؟ كابال يبدو مرتبكًا

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

سؤال

كابال يعطيني رسائل مختلطة. عندما أقول:

Extensions: DeriveFunctor

انها تقول:

Warning: Unknown extensions: DeriveFunctor

لكن عندما أقول:

GHC-Options: -XDeriveFunctor

انها تقول:

Warning: Instead of 'ghc-options: -XDeriveFunctor' use 'extensions:
DeriveFunctor'

الآن سأستخدم فقط {-# LANGUAGE DeriveFunctor #-} براغما.

$ cabal --version
cabal-install version 0.8.2
using version 1.8.0.6 of the Cabal library 
$ ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.12.3
$ basename $(mdfind haskell-platform | grep .dmg)
haskell-platform-2010.2.0.0.i386.dmg
هل كانت مفيدة؟

المحلول

بحسب ال توثيق المتسلل, ، اعتبارا من كابال -1.8.0.6 DeriveFunctor غير معترف بها. إنها إضافة جديدة نسبيًا إلى GHC ولا يبدو أنها تستخدم على نطاق واسع ، لذلك لست مندهشًا من أنه كان من الممكن تجاهله للكابال. من المحتمل أن يتم تقديم هذا كخلة (طلب ميزة؟) ضد Cabal.

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

نصائح أخرى

لا يزال بإمكانك الاستخدام extensions: DeriveFunctor في ملف .cabal الخاص بك. نعم ، إنه ليس امتدادًا معروفًا حاليًا بـ Cabal ، ولكن لا يزال بإمكانك استخدامه وطالما أن المترجم يعترف به ، فسيعمل. في الواقع ، سوف تحقق Cabal أن المترجم لا يتعرف على التمديد ، على الرغم من أن Cabal لا يعرف نفسه.

هناك سجل مركزي للامتدادات في الوحدة النمطية Language.Haskell.Extension. الغرض من هذا السجل هو أن يتمكن المترجمون المختلفون من الاتفاق على نفس الأسماء عند تنفيذ نفس الامتدادات. لقد كان لدينا حالات في الماضي حيث أعطى مؤلفون من مختلف المترجمين الأسماء عن طريق الخطأ أسماء مختلفة لنفس مفهوم التمديد. لا تحتاج جميع الامتدادات إلى التسجيل. من المنطقي عدم تسجيل الامتدادات التي لا تزال تجريبية للغاية ، على سبيل المثال لا تزال امتدادات DPH "PARR" غير مسجلة. يتطلب Hackage جميع الحزم التي تم تحميلها لاستخدام ملحقات مسجلة معروفة فقط ، وهذا أمر منطقي لأنه إذا كان الامتداد جاهزًا بما فيه الكفاية لاستخدامه في حزمة موزعة ، فمن الجيد التسجيل.

في هذه الحالة بالذات ، يبدو أن GHC Devs قد نسي تسجيل التمديد.

تجدر الإشارة أيضًا إلى أنه اعتبارًا من Cabal-1.10 extensions يتم تقسيم الحقل إلى قسمين: default-extensions و other-extensions. هذا يعالج القضية التي يشير إليها جون في إجابته ، أن السلوك السابق هو أن جميع الامتدادات نشطة لجميع الوحدات النمطية ، والتي نعترف بها أنها خطأ. ال other-extensions يسمح الحقل بالملحقات المستخدمة في بعض الوحدات (أي مع LANGUAGE براغما) ليتم إدراجها. سوف كابال في نهاية المطاف فرض أن جميعها مدرجة ، تمامًا كما يتطلب إدراج جميع تبعيات الحزمة. التبعيات اللغوية هي تبعيات أيضا.

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