Scala:带泛型的函数参数的默认值

时间:2017-02-03 12:45:50

标签: scala generics default-value

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

我的功能签名如下:

  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 ] ] ] = {
  }
带有明显错误消息的

:选项[T]不符合预期的选项[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 ] ] ] = {
  }

但这种方法会迫使我在函数调用中传递我的泛型参数。

任何人都可以看到任何其他方法吗?

1 个答案:

答案 0 :(得分: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)