2010-05-20 10 views
2

아래의 코드 스 니펫에서 - 왜 Nil에 대한 유형 주석을 제공해야합니까?스칼라의 타입 추론 기가 왜 이것을 해결할 수 없습니까?

Welcome to Scala version 2.8.0.RC2 (OpenJDK Server VM, Java 1.6.0_18). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> List(Some(1), Some(2), Some(3), None).foldLeft(Nil)((lst, o) => o match { case Some(i) => i::lst; case None => lst })   
<console>:6: error: type mismatch; 
found : List[Int] 
required: object Nil 
    List(Some(1), Some(2), Some(3), None).foldLeft(Nil)((lst, o) => o match { case Some(i) => i::lst; case None => lst }) 
                          ^

scala> List(Some(1), Some(2), Some(3), None).foldLeft(Nil:List[Int])((lst, o) => o match { case Some(i) => i::lst; case None => lst }) 
res1: List[Int] = List(3, 2, 1) 

답변

3

문제가 NilList 연장 목적이다. 즉, Nil.typeList의 하위 클래스이므로 foldLeft의 누적 기 유형은 Nil.type이됩니다.

스칼라가 더 나은 유형을 유추하기가 더 힘들어지기를 바란다.

0

당신은 그 직접 귀하의 질문에 대답하지 않을 수도 있지만이

private def removeNone[A](xs:List[Option[A]]) = { 
    xs.filter(_.isInstanceOf[Some[_]]).map(_ match { 
     case Some(t) => t 
     case _ =>().asInstanceOf[A] //can't happen, needed to avoid warning 
    }) 
} 

처럼 수행하여 문제를 피할 수있다, 나는 몇 시간 전에이 기능을 쓰고 그것을 공유 다치게 할 수 없다 생각했다. 경고를 받으면 괜찮 으면 2 번째 사례를 생략 할 수 있습니다.

지도와 필터의 조합이 폴드보다 읽기 쉽습니다. 필요한 경우에만 폴드를 사용하려고합니다.

관련 문제