[英]type inference and for expression in 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
杜絕了一個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]]]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.