0

我有一系列函数接受一个函数作为参数 ( func),它们的唯一区别是func接受不同数量的参数。

  def tryGet[T,A](func: (A) => T)
  def tryGet[T,A,B](func: (A,B) => T)
  ...       [T,A,B,C...]

有没有办法让函数接受具有任何长度参数列表的函数?

我尝试使用可变长度参数列表,例如,func:(A*)但在传递任何函数时遇到了麻烦,因为它现在需要一个Seq[A].

4

2 回答 2

4

你可以尝试使用shapeless.ops.function.FnToProduct

def tryGet[F: FnToProduct](func: F) = ???

val f1: Int => String = ???
val f2: (Int, Int) => String = ???
val f3: (Int, Int, Int) => String = ???

tryGet(f1)
tryGet(f2)
tryGet(f3)

https://github.com/milessabin/shapeless/wiki/Feature-overview:-shapeless-2.0.0#facilities-for-abstracting-over-arity

于 2019-09-18T14:25:45.430 回答
1

为什么不直接使用 scala.util.Try?或者只是将参数传递给 tryGet,而不是作为块,而是作为类型 T 的别名参数?

于 2019-09-18T17:18:07.067 回答