类型推断和scala中的表达式

这工作

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 [Long]]必需:选项[?]

我使用scala 2.10来使用Eclipse IDE

为什么类型推断失败?


类型推断是不是失败了,它是在for desugars成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]]]

链接地址: http://www.djcxy.com/p/38019.html

上一篇: type inference and for expression in scala

下一篇: Why scala doesn't infer type from generic type parameters?