لماذا تتسطح المعلنة على GenericTraversableTemplate وليس TraversableLike؟
-
05-07-2019 - |
سؤال
والتوقيع من TraversableLike.flatMap
هو كما يلي:
def flatMap[B, Th](f : (A) => Traversable[B])(implicit bf : CanBuildFrom[Repr, B, Th]) : Th
والتوقيع من GenericTraversableTemplate.flatten
هو:
def flatten[B](implicit asTraversable : (A) => Traversable[B]) : CC[B]
لماذا هو الأسلوب الأخير (والذي يبدو لي أن تختلف من flatMap
فقط بمعنى أن وظيفة المحول هي implicit
) لا يمكن تحديدها على TraversableLike
على النحو التالي:
def flatten[B, Th](implicit asTraversable: (A) => Traversable[B],
implicit bf : CanBuildFrom[Repr, B, Th]) : Th
هل هناك سبب أن هذا يجب أن يكون عليه الحال؟
المحلول
وأعتقد أن الإجابة تكمن في التعليمات البرمجية المصدر:
def flatten[B](implicit asTraversable: A => /*<:<!!!*/ Traversable[B]): CC[B]
يجب أن يكون في الواقع flatten
المعلمة ضمنية إلى A <:< Traversable[B]
(أي تأكيد أن المعلمة العامة للGenericTraversableTemplate
هي نفسها Traversable
). (راجع هذا بريدية موضوع قائمة للنقاش حول السبب في انه علق في الوقت الراهن للخروج.) ما أفهمه هو أن جميع الطرق في هذه الصفة كان يتم تعريفها على (بعض) الكائنات رفيق جمع الصفوف لأنهم كانوا لا ينطبق إلا على بعض التجسيدات (إذا كان هذا هو كلمة حق) من المعلمات نوع. هذا البناء <:<
يسمح لهم القيام بها وسائل المثال.