2014-04-10 5 views
1

의 표현이이 작동하지 않는타입 추론과 스칼라

val keys Option[List[Option[String]]] = someFunctionThatReturnsKeys() 
val tries = for (
    unwrapped <- keys) { 
     for(keyOption <- unwrapped; 
      stripped <- keyOption if stripped.contains(":")) 
     yield Try(java.lang.Long.parseLong(stripped.substring(stripped.lastIndexOf(":") + 1)))   } 

작동합니다.

val tries = for (
       unwrapped <- keys; 
       keyOption <- unwrapped; 
       stripped <- keyOption if stripped.contains(":")) 
      yield Try(java.lang.Long.parseLong(stripped.substring(stripped.lastIndexOf(":") + 1))) 

오류는 오류

유형 불일치로 표시

keyOption <- unwrapped; 

광고입니다; 발견 : 목록 [scala.util.Try [긴] 필요 : 옵션

나는

왜 형식 유추가 실패 스칼라 2.10 Eclipse IDE를 사용하고 [?]?

답변

1

타입 추론은 실패하지 않습니다. forflatMap이고, Option은 다른 것을 평평하게하는 방법을 알지 못합니다. Option입니다.

반환 유형을 어떻게 하시겠습니까? 그것은 당신이 실제로하고 싶은 것을 결정할 것입니다. 예를 들어, 목록을 원할 경우 :

val tries = for { 
    unwrapped <- keys.toList; 
    keyOption <- unwrapped; 
    stripped <- keyOption if stripped.contains(":") 
} yield Try(stripped.substring(1 + stripped.lastIndexOf(":")).toLong) 

트릭을 수행합니다. List[Try[Long]]이 표시되며 외부 OptionNone 인 경우 비어있게됩니다.

당신이 외부 옵션을 유지하려면

, 당신은 정말 map하지 더 쉽게과 같이 기록되어 외부에서 flatMap 원하는 :

val tries2 = keys.map(unwrapped => for { 
    keyOption <- unwrapped; 
    stripped <- keyOption if stripped.contains(":") 
} yield Try(stripped.substring(1 + stripped.lastIndexOf(":")).toLong)) 

이 당신에게 Option[List[Try[Long]]]을 줄 것이다.

관련 문제