2013-05-10 3 views
5

다음 코드스칼라에 대한-이해 타입 추론

def f(chars: List[Char]): List[List[Char]] = chars match { 
    case Nil => List(Nil) 
    case x :: xs => for { 
     v <- f(xs) 
    } yield List(x) :: v 
    } 

- type mismatch; found : List[List[Any]] required: List[List[Char]] 

이 '의'가장 일반적인 모든 char 대신 여기에 선택 왜 나를 이해하는 데 도움 주시기 바랍니다 오류 메시지가 제공? 언어 사양에서 어떤 주제를 읽어야합니까? 감사.

답변

10

yieldingList[List[List[Char]]]List[List[Char]]의 혼합입니다. Scala는이를 List[List[Any]]으로 업 캐스팅합니다. 귀하의 경우를 들어 다음 중 하나는 일을 할 것입니다 :

scala> def f(chars: List[Char]): List[List[Char]] = chars match { 
    |  case Nil => List(Nil) 
    |  case x :: xs => for { 
    |  v <- f(xs) 
    |  } yield x :: v 
    | } 
f: (chars: List[Char])List[List[Char]] 

scala> def f(chars: List[Char]): List[List[Char]] = chars match { 
    |  case Nil => List(Nil) 
    |  case x :: xs => for { 
    |  v <- f(xs) 
    |  } yield List(x) ++ v 
    | } 
f: (chars: List[Char])List[List[Char]] 
6

문제는 List(x) - 그것은 x 할 필요가있다.

먼저 vf(xs)의 결과를 반복하며 fList[List[Char]]을 반환합니다. 즉, 결과는 List[X]이고, Xyield에 의해 반환되는 유형입니다.

v의 유형은 f(xs)의 내용을 반복하므로 List[Char]입니다. 그래서 에 List[Char]을 붙이는 List(x) :: v의 유형을 찾아야합니다. 이 아니고이 연결됩니다. 문자 만 들어있는 목록에 목록을 추가합니다. 결과 목록에는 CharList[Char]이 모두 포함됩니다.

두 가지를 모두 만족하는 유형이 Any이므로 XAny이고 결과는 List[Any]입니다.