Scala隐式类必须有一个主构造函数,在第一个形参列表中只有一个实参



大家好,我有一个这样的问题:

implicit class mapValue[T](f: Future[T]){
def mapValue[T]( f: Future[T] )(implicit ec: ExecutionContext): Future[Try[T]] = {
val prom = Promise[Try[T]]()
f onComplete prom.success
prom.future
}

}
implicit class traverseFilteringErrors[A, B](seq: Seq[A])(f: A => Future[B]){  // >*It says implicit class must have a primary constructor with exactly one argument in first parameter list here 
def traverseFilteringErrors[A, B](seq: Seq[A])(f: A => Future[B])(implicit ec: ExecutionContext): Future[Seq[B]] = {
Future.traverse( seq )( f andThen mapValue ) map ( _ collect{ case Success( x )  => x } )  // >and Type mismatch. Required: Future[B] => NotInferredA, found: Future[Nothing] => mapValue[Nothing] here.
}
}

它说:

隐式类必须有一个主构造函数,在def traverseFilteringErrors

的第一个形参列表中只有一个实参

类型不匹配。要求:未来[B] =>NotInferredA, found: Future[Nothing] =>mapValue[Nothing] at f and Then mapValue part

我是scala的新手,所以我应该怎么做来解决这个问题?

似乎你正在尝试创建一些扩展方法,但你对语法如何工作有点困惑。

这个想法是,implicit class将只有一个参数,您将在其上添加扩展方法的值。但是,你在扩展方法的参数中复制了那个值,这是没有意义的。
你还会遇到其他语法问题,比如遮蔽泛型参数。

修复后,并使用最佳实践,如使您的implicit classes值类,那么我们有几个语法错误可以很容易地修复。

最终结果如下:

import scala.concurrent.{ExecutionContext, Future, Promise}
import scala.util.{Try, Success}
object syntax {
implicit class mapValue[T](private val f: Future[T]) extends AnyVal {
def mapValue(implicit ec: ExecutionContext): Future[Try[T]] = {
val prom = Promise[Try[T]]()
f.onComplete(prom.success)
prom.future
}
}
implicit class traverseFilteringErrors[A](private val seq: Seq[A]) extends AnyVal {
def traverseFilteringErrors[B](f: A => Future[B])(implicit ec: ExecutionContext): Future[Seq[B]] = {
Future
.traverse(seq)(f.andThen(_.mapValue))
.map(_.collect { case Success( x )  => x })
}
}
}

总的来说,你似乎对这门语言有点陌生,在没有理解基础的情况下尝试一些高级的东西;无论如何,希望这对你有帮助。


你可以看到代码在这里运行

相关内容

最新更新