gpt4 book ai didi

scala - "Missing parameter type"in for-comprehension 重载flatMap时

转载 作者:行者123 更新时间:2023-12-02 04:38:55 26 4
gpt4 key购买 nike

我编写了自己的类似 Either 的 monad 类,名为 Maybe,其中包含一个值或一个错误对象。我希望此类的对象与 Future 结合,这样我就可以将 Maybe[Future[T], E]] 变成 Future[Maybe[ T, E]]。因此我实现了两个 flatMap 方法:

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Future

sealed abstract class Maybe[+E, +V] {

def map[W](f: V ⇒ W ): Maybe[E, W] = this match {
case Value(v) ⇒ Value(f(v))
case Error(_) ⇒ this.asInstanceOf[Error[E, W]]
}

def flatMap[F >: E, W](f: V ⇒ Maybe[F, W]): Maybe[F, W] = this match {
case Value(v) ⇒ f(v)
case Error(_) ⇒ this.asInstanceOf[Error[F, W]]
}

def flatMap[W](f: V ⇒ Future[W]): Future[Maybe[E, W]] = this match {
case Value(v) ⇒ f(v).map(Value(_))
case Error(_) ⇒ Future.successful(this.asInstanceOf[Error[E, W]])
}
}

final case class Value[+E, +V](value: V) extends Maybe[E, V]
final case class Error[+E, +V](error: E) extends Maybe[E, V]

但是,当我使用 for comprehension 组合一个 Maybe 和一个包含另一个 MaybeFuture 时,Scala 编译器给我错误消息 missing parameter type at the line of the outer generator:

def retrieveStreet(id: String): Future[Maybe[String, String]] = ...

val outerMaybe: Maybe[String, String] = ...

val result = for {
id ← outerMaybe // error message "missing parameter type" here!
street ← retrieveStreet(id)
} yield street

但是当我不使用 for 而是显式调用 flatMapmap 方法时,它起作用了:

val result2 =
outerMaybe.flatMap( id => retrieveStreet(id) )
.map( street => street )

(当我尝试在理解中将 Maybe 与另一个 Maybe 组合时,我也会收到此错误消息。)

所以问题是:

  1. 这两个替代方案的行为不应该完全相同吗?为什么编译器在显式调用 flatMap 时找出要调用的正确 flatMap 方法?

  2. 显然编译器对两个 flatMap 实现感到困惑,有没有办法告诉它(通过任何地方的类型规范)应该在 for comprehension 中调用哪一个?

我在 Eclipse 中使用 Scala 2.11.8。

最佳答案

我不能给你一个全面的答案,但是通过 scalac -Xprint:parser 运行它,我可以告诉你这两个替代方案实际上脱糖略有不同,这很可能是您问题的来源。

val result1 = outerMaybe
.flatMap(((id) => retrieveStreet(id)
.map(((street) => street))));

val result2 = outerMaybe
.flatMap(((id) => retrieveStreet(id)))
.map(((street) => street))

关于scala - "Missing parameter type"in for-comprehension 重载flatMap时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39148422/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com