类型推断和在scala中表达

时间:2014-04-10 19:33:06

标签: scala types type-inference scala-2.10

这有效

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;

错误显示为

  

类型不匹配; found:列出[scala.util.Try [Long]]:选项[?]

我正在使用scala 2.10的eclipse ide

为什么类型推断失败?

1 个答案:

答案 0 :(得分:1)

类型推断没有失败,for去了flatMap,而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]]]