سؤال

أثناء محاولتك إيجاد حل لسؤال آخر ([1]) لقد صادفت خطأ توسعًا ضمنيًا متباينًا.أبحث عن تفسير لما يعنيه هذا

إليك حالة الاستخدام:

scala> implicit def ordering[T](implicit conv: T => Ordered[T], res: Ordering[Ordered[T]]) = Ordering.by(conv)
ordering: [T](implicit conv: (T) => Ordered[T],implicit res: Ordering[Ordered[T]])scala.math.Ordering[T]

scala> def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted
<console>:6: error: diverging implicit expansion for type Ordering[T]
starting with method ordering in object $iw
       def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted
                                                ^
هل كانت مفيدة؟

المحلول

إذا قمت بتشغيل هذا في سكالا مع -Xlog-implicits تم تمرير الوسيطة، وستحصل على مزيد من المعلومات:

scala.this.Prefed.conforms ليست قيمة ضمنية صالحة لـ (T) => Ordered[T] للأسباب التالية:

عدم تطابق نوع:

وجد :<:<[ت،ت]

مطلوب:(T) => مرتب[T]

scala.this.predef.conforms ليست قيمة ضمنية صالحة لـ (Ordered[T]) => Ordered[Ordered[T]] للأسباب التالية:

عدم تطابق نوع:

وجد :<:<[أمر[T]، أمر[T]]

مطلوب :(تم الطلب[T]) => تم الطلب[تم الطلب[T]]

math.this.Ordering.ordered ليست قيمة ضمنية صالحة لـ Ordering[T] للأسباب التالية:

وسيطات النوع [T] لا تتوافق مع حدود معلمات النوع المطلوبة للطريقة [A <:scala.math.Ordered[A]]

هذه في الغالب تكهنات، ولكن يبدو أنها منطقية إلى حد ما.سأحاول التحقيق أكثر:

ويبدو أن هذا يشير إلى أن هناك ثلاثة دلالات ضمنية يتم النظر فيها هنا.وفي النهاية التوقيع sorted يتطلب ذلك للعثور على شيء من النوع Ordering[T].لذا فهي تحاول بناء وظيفتك الضمنية ordering.أولاً، يحاول ملء الفراغ conv من خلال العثور على نوع ضمني (T) => Ordered[T], ، حيث يتم البحث في Predef - والذي يبدو وكأنه ينبح الشجرة الخطأ.ومن ثم يحاول العثور على ضمني لـ (Ordered[T]) => Ordered[Ordered[T]] في نفس المكان منذ ذلك الحين by يأخذ معلمة ضمنية من النوع Ordering[S], ، أين S يكون Ordered[T] بفضل conv.لذلك لا يمكن البناء ordering.

ثم يحاول استخدامه ordering في الرياضيات.الترتيب، ولكن هذا أيضًا غير مناسب.ومع ذلك، أعتقد أن هذا هو ما يعطي رسالة "ضمنية متباينة" مربكة إلى حد ما.المشكلة ليست في أنهم متباعدون، بل في عدم وجود مسار مناسب في النطاق، ولكن هناك ارتباك بسبب حقيقة أن هناك طريقين يجب اتباعهما.إذا حاول أحد تحديد def foo[T <% Ordered[T]](s : Seq[T]) = s.sorted بدون الوظيفة المرتبة الضمنية، فإنها تفشل بمجرد رسالة لطيفة تفيد بأنها لا تستطيع العثور على وظيفة ضمنية مناسبة.

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