【问题标题】:type inference and for expression in scalascala 中的类型推断和表达式
【发布时间】:2023-03-20 14:20:01
【问题描述】:

这行得通

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;

错误显示为

类型不匹配;发现:List[scala.util.Try[Long]] required: Option[?]

我正在使用带有 scala 2.10 的 eclipse ide

为什么类型推断失败?

【问题讨论】:

    标签: scala types type-inference scala-2.10


    【解决方案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]],如果外部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]]]

    【讨论】:

      猜你喜欢
      • 2012-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-29
      相关资源
      最近更新 更多