【问题标题】:How to fix: "found : (AnyVal, AnyVal) required: (Double, Double)" with Futures如何修复:“发现:(AnyVal,AnyVal)需要:(双,双)”与期货
【发布时间】:2019-06-24 07:01:13
【问题描述】:

编译错误:

[error] found : ((Double, Double)) => scala.concurrent.Future[(Double, Double)]

[error] required: ((AnyVal, AnyVal)) => scala.concurrent.Future[?] [error](c: (Double, Double)) => Future(c).map(x=>x )

IDE 可以正常接受代码。

代码是使用 for 循环和 yield 编写的。我试图简化它。

def f(r: UUID, l: Int) = {
  g(r).flatMap { (c: (Double, Double)) => /*** this part is just for the debugging ***/
    Future(c).map(x=>x)
  }
}

def g(r: UUID) = {
  session.selectOne(
    s"""
      SELECT
        ${RR.x},
        ${RR.y}
      FROM
        ${RR.g}
      WHERE
        ${RR.r} = ?
      ORDER BY
        ${RR.t} DESC
    """,
    r.toString
  ).map {
    case Some(row) => (1.0,1.0) //will be replaced when it is working
    case None => (0,0)
  }
}

编译器发现 c 的类型是 (AnyVal, AnyVal) 我希望它是 (Double,Double)

【问题讨论】:

  • 两个解决方案,第一个将 None case 更改为 (0.0d, 0.0d)。 secod (赌一个),在你的方法上使用显式类型签名。 def g(r: UUID): (Double, Double).

标签: scala functional-programming future


【解决方案1】:

它实际上是在抱怨你传递给 flatmap 的方法的函数签名不是它所需要的。尝试在 g 函数中将 case None => (0,0) 行更改为 case None => (0d, 0d)。如果两个 case 分支返回不同的类型,它将默认为两者的超类型。在这种情况下,您的 g 函数看起来返回类型 (AnyVal,AnyVal)

【讨论】:

  • @Lulu 如果这解决了您的问题,请稍候accept the answer and thereby mark the question as solved
  • @Jeremy,请注意,它实际上将使用两个分支的 “弱最小上界” - 在这种情况下 (AnyVal, AnyVal) ( Any)。其次,由于Int 可以自动向上转换为Double,恕我直言,最好是使用显式类型签名,因为它不仅可以作为文档并解决这个问题,而且还可以解决许多其他(可能更难) 未来类型推断的问题。
  • @LuisMiguelMejíaSuárez 关于“弱最小上限”:谢谢,我已纠正。不过,我实际上并不知道弱最小上限是什么。
  • @Jeremy 我也不是 (至少不是在 LOL 表达的非常正式意义上) - 但在 “平凡” 术语中,它基本上意味着它搜索其更具体的上限(在本例中为AnyVal,以确保您获得良好的抽象来使用,因为它可以始终使用Any 来处理所有事情. - 对于least 部分,对于weakthis 是一个非常明确的定义(我可以在这里写的任何东西都更清楚)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-25
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
相关资源
最近更新 更多