这有效
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
为什么类型推断失败?
答案 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]]
,如果外部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]]]
。