【问题标题】:Scala: Default value for function parameter with genericsScala:具有泛型的函数参数的默认值
【发布时间】:2017-06-20 20:22:54
【问题描述】:

当类型是泛型时,我无法为函数参数设置默认值。

我的函数签名如下:

  def doStuff[ K, T ]( result: Future[ Seq[ T ] ] )
                     ( transform: T => Option[ K ] ): Future[ Either[ String, Option[ K ] ] ] = {
  }

而且我知道我给函数参数设置了一个默认值,例如:

  def doStuff(a: Int)
             (f: Int => Option[Int] = k => Option(k)): Future[ Either[ String, Option[ Int ] ] ] = {
  }

但是我不能将这些泛型类型与默认函数值结合起来

  def doStuff[ K, T ]( result: Future[ Seq[ T ] ] )
                     ( transform: T => Option[ K ] = k => Option(k)): Future[ Either[ String, Option[ K ] ] ] = {
  }

带有明显的错误信息:Option[T] 不符合预期的 Option[K]

我最后的办法是为 K 和 T 传递类标记并将默认参数从 k => Option(k) 更改为

def doStuff[ K: ClassTag, T ]( result: Future[ Seq[ T ] ] )
                               ( transform: T => Option[ K ] = {
                                 case m: K => Option( m )
                                 case _ => None
                               } ): Future[ Either[ String, Option[ K ] ] ] = {
  }

但这种方法将迫使我在函数调用时传入我的泛型参数。

谁能看到其他方法?

【问题讨论】:

  • TK之间有关系吗?
  • 对于默认情况 K 是 Option[T] 但否则不,根本没有关系,它们可以并且将是完全不同的情况类
  • @kali 有必要让doStuff 有两个参数列表吗?可以和一个吗?
  • 如果你想不出一个合理的默认值,为什么要分配一个?
  • 或者您的目标是在没有提供第二个参数时也让K 默认为T

标签: scala generics default-value


【解决方案1】:

我还没有通过您提供的两个参数列表的签名来实现它。但是我想知道您是否可以将其与一个参数列表一起使用:

def toOption[R](x: R): Option[R] = Option(x)

def doStuff[K, T](result: Future[Seq[T]], transform: T => Option[K] = toOption[K] _): Future[Either[String, Option[K]]] = {
  result.map(r => Right[String, Option[K]](transform(r.head)))
}

// Then, if you need a function of the second parameter, you can use partially applied function:
val rf: (Int => Option[Int]) => Future[Either[String, Option[Int]]] = doStuff[Int, Int](Future(List(1, 2)), _)

// Or call with default argument:
val r: Future[Either[String, Option[Int]]] = doStuff[Int, Int](Future(List(1, 2)))

// These lines should print the same
println(rf(toOption))
println(r)

【讨论】:

  • 您好,感谢您的回答。如果我“使用”泛型参数 (doStuff[Int, Int](.....)) 调用函数,那么我宁愿使用我在问题中提到的“最后手段”方法
猜你喜欢
  • 1970-01-01
  • 2018-02-18
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 1970-01-01
  • 2014-02-27
  • 2013-09-21
相关资源
最近更新 更多