簡體   English   中英

在scala中進行類型推斷和表達

[英]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]] ,如果外部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]]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM