2009-11-26 4 views
2

TraversableLike.flatMap의 서명은 다음과 같습니다평판이 TraversableLike가 아닌 GenericTraversableTemplate에서 선언되는 이유는 무엇입니까? 다음과 같이

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 

이것이 반드시 필요한 이유가 있습니까?

+0

스칼라 2.7 또는 2.8? 컬렉션 라이브러리는 2.8 버전에서 많이 개편되었습니다. –

+1

2.8로 질문을 태그했을뿐만 아니라 2.7에 존재하지 않는 Traversable 특성을 참조합니다! –

답변

2

나는 대답은 소스 코드에있다 생각한다. (즉, GenericTraversableTemplate의 일반 매개 변수 자체 Traversable이라고 주장)

def flatten[B](implicit asTraversable: A => /*<:<!!!*/ Traversable[B]): CC[B] 

flatten에 대한 암시 적 매개 변수가 실제로 A <:< Traversable[B]해야한다. (이유는 현재 주석 처리 된 이유에 대한 설명은 this mailing list thread을 참조하십시오.)이 특성의 모든 메소드는 일부 인스턴스화에만 적용 할 수 있기 때문에 (일부) 컬렉션 클래스의 컴패니언 오브젝트에 정의되어있었습니다. 오른쪽 단어). 이 <:< 구조체는 인스턴스 메소드로 만들 수 있습니다.