لماذا تتسطح المعلنة على GenericTraversableTemplate وليس TraversableLike؟

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

سؤال

والتوقيع من 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). (راجع هذا بريدية موضوع قائمة للنقاش حول السبب في انه علق في الوقت الراهن للخروج.) ما أفهمه هو أن جميع الطرق في هذه الصفة كان يتم تعريفها على (بعض) الكائنات رفيق جمع الصفوف لأنهم كانوا لا ينطبق إلا على بعض التجسيدات (إذا كان هذا هو كلمة حق) من المعلمات نوع. هذا البناء <:< يسمح لهم القيام بها وسائل المثال.

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