أنواع مقبولة في الرقمية.إعلان وظائف
-
11-12-2019 - |
سؤال
أنا بعد نجاح يذكر التفاف رأسي حول السباكة الأساسية من أنواع المشاركة في 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