سؤال

أنا بعد نجاح يذكر التفاف رأسي حول السباكة الأساسية من أنواع المشاركة في ad الحزمة.على سبيل المثال التالي يعمل تماما:

import Numeric.AD

ex :: Num a => [a] -> a
ex [x, y] = x + 2*y

> grad ex [1.0, 1.0]
[1.0, 2.0]

حيث grad لديه نوع:

grad
  :: (Num a, Traversable f) =>
     (forall (s :: * -> *). Mode s => f (AD s a) -> AD s a)
     -> f a -> f a

إذا قمت بتغيير نوع التوقيع ex إلى [Double] -> Double ومحاولة نفس الشيء ، أحصل على

Couldn't match expected type `AD s a0' with actual type `Double'
Expected type: f0 (AD s a0) -> AD s a0
  Actual type: [Double] -> Double

نفس السلوك يحدث عند استبدال Double مع ما يبدو أي نوع منشئ مع نوع * أن instantiates Num.

عندما Traversable f قائمة أول حجة grad يجب أن يكون نوع [AD s a] -> AD s a لبعض مقبول Mode - على سبيل المثال ، Reverse.ولكن من الواضح المستخدم grad لم يكن لديك للتعامل مع AD منشئ أو Mode مباشرة.تطل في هذه الداخلية قد تركت مني قليلا الخلط.على وجه التحديد, أنا لا يمكن أن تتبع نوع/نوع درب الفرق بين استخدام Num a => [a] -> a و [Double] -> Double.

لماذا نوع التوقيع [Double] -> Double يسبب مشاكل مع grad?ومن حيث سهل القديمة استخدام المكتبة:هل هناك أي طريقة لاستخدام [Double] -> Double نسخة من ex, أو هو متعدد الأشكال النسخة ضروري ؟

(العنوان مستوحى من هذا سؤال مشابه)

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

المحلول

أنا لا أعرف ad مكتبة, ولكن منذ grad وتتوقع وظيفة من نوع [AD s a] -> AD s a كما المعلمة الأولى, لا يمكنك أن تتوقع أن تكون قادرة على تمرير ذلك وظيفة من نوع [Double] -> Double, منذ Double و AD هي أنواع مختلفة تماما.

عام وظيفة مع Num القيد يعمل, لأن AD في حد ذاته هو أيضا مثيل Num, ولذلك في العمل الخاص بك سبيل المثال ، ex يحصل المتخصصة إلى شيء من هذا القبيل

ex :: (Mode s, Fractional a) => [AD s a] -> AD s a

إذا كنت تريد أن تتخصص ex لإجراء العمليات الحسابية باستخدام الزوجي ، تحتاج إلى إعطائها توقيع مثل

ex :: Mode s => [AD s Double] -> AD s Double
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top