Scala 隐式 class 必须有一个主构造函数,在第一个参数列表中只有一个参数
Scala implicit class must have a primary constructor with exactly one argument in first parameter list
大家好,我有这样的问题:
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.
}
}
它说:
implicit class must have a primary constructor with exactly one argument in first parameter list at def traverseFilteringErrors
和
Type mismatch. Required: Future[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 })
}
}
}
总的来说,您似乎对这门语言有点陌生,并且在没有先了解基础知识的情况下尝试一些高级的东西;无论如何,希望这对您有所帮助。
可以看到代码运行 here.
大家好,我有这样的问题:
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.
}
}
它说:
implicit class must have a primary constructor with exactly one argument in first parameter list at def traverseFilteringErrors
和
Type mismatch. Required: Future[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 })
}
}
}
总的来说,您似乎对这门语言有点陌生,并且在没有先了解基础知识的情况下尝试一些高级的东西;无论如何,希望这对您有所帮助。
可以看到代码运行 here.