2012-02-29 2 views
9

를 사용하는 경우 List(3,2,1).toIndexedSeq.sortBy(x=>x)가 작동하지 않는 이유가 궁금 오류 "암시 적 확장을 발산하는"혼동 :스칼라 - "sortBy"

scala> List(3,2,1).toIndexedSeq.sortBy(x=>x) // Wrong 
<console>:8: error: missing parameter type 
       List(3,2,1).toIndexedSeq.sortBy(x=>x) 
              ^
<console>:8: error: diverging implicit expansion for type scala.math.Ordering[B] 
starting with method Tuple9 in object Ordering 
       List(3,2,1).toIndexedSeq.sortBy(x=>x) 
              ^

scala> Vector(3,2,1).sortBy(x=>x) // OK 
res: scala.collection.immutable.Vector[Int] = Vector(1, 2, 3) 

scala> Vector(3,2,1).asInstanceOf[IndexedSeq[Int]].sortBy(x=>x) // OK 
res: IndexedSeq[Int] = Vector(1, 2, 3) 

scala> List(3,2,1).toIndexedSeq.sortBy((x:Int)=>x) // OK 
res: scala.collection.immutable.IndexedSeq[Int] = Vector(1, 2, 3) 
+2

또한'List (3,2,1) .toIndexedSeq.sortBy (identity)'는보다 유용한 오류와'List (3,2,1). toIndexedSeq [Int] .sortBy (x => x)'는 잘 동작합니다. – dhg

+0

sortBy 및 toIndexedSeq :'List (3, 2, 1) .sortBy (x => x)를 전환 할 수 있습니다. toIndexedSeq' –

답변

6

당신이 ListtoIndexedSeq의 유형 서명을 보면 당신이 걸리는 볼 수 있습니다 가능한 가장 구체적인 유형을 복용 그런 다음 컴파일러는 기본적으로 당신이 무엇을 의미하는지 생각하는 유형의 매개 변수를 생략하면

def toIndexedSeq [B >: A] : IndexedSeq[B] 

: A의 슈퍼 될 수있는 형식 매개 변수 B, . List(3,2,1).toIndexedSeq[Any]을 의미 할 수 있습니다. 물론 Ordering[Any]이 없기 때문에 정렬 할 수 없습니다. 그것은 전체 표현식이 올바른 타이핑 (컴파일러 내부에 대해 뭔가를 아는 누군가가 이것을 확장 할 수있을 것입니다.) 될 때까지 컴파일러가 "타입 매개 변수 추측"을 재생하지 않는 것 같습니다.

당신이 중 하나) 자신이

List(3,2,1).toIndexedSeq[Int].sortBy(x=>x) 

을 즉, 또는 b) 두 가지로 표현을 분리하므로 형식 매개 변수가 sortBy를 호출하기 전에 추론해야하는 필수 유형 매개 변수를 제공 할 수 있습니다 작동하게하려면

val lst = List(3,2,1).toIndexedSeq; lst.sortBy(x=>x) 

편집 :

아마 때문에입니다은 Function1 인수를 취합니다. sortBy의 서명은 내가 Function1 원인이 문제는 내가에 갈거야 이유를 정확하게 확실하지 않다 (! 대신 사용한다) sorted 반면

def sortBy [B] (f: (A) => B)(implicit ord: Ordering[B]): IndexedSeq[A] 

입니다 List(3,2,1).toIndexedSeq.sorted

def sorted [B >: A] (implicit ord: Ordering[B]): IndexedSeq[A] 

와 함께 잘 작동 그래서 더 이상 생각할 수 없다 ...

+0

은 2.10 이후에 작동합니다. –