类型推断和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]]
,如果外部Option
是None
,它将是空的。
如果你想保留外部选项,你真的想要一个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]]]
。
上一篇: type inference and for expression in scala
下一篇: Why scala doesn't infer type from generic type parameters?