Scala 将varargs选项的延迟压缩缩放为tuple选项

Scala 将varargs选项的延迟压缩缩放为tuple选项,scala,tuples,variadic-functions,Scala,Tuples,Variadic Functions,我想将多个选项组合为一个元组选项: val maybeA: Option[Int] = ... val maybeB: Option[String] = ... val combined: Option[(Int,String)] = combine(maybeA, maybeB) 有很多方法可以做到这一点,让我们一起来: def combined[X,Y](maybeA: Option[X], maybeB: Option[Y]) = maybeA.zip(maybeB).headOpti

我想将多个选项组合为一个元组选项:

val maybeA: Option[Int] = ...
val maybeB: Option[String] = ...

val combined: Option[(Int,String)] = combine(maybeA, maybeB)
有很多方法可以做到这一点,让我们一起来:

def combined[X,Y](maybeA: Option[X], maybeB: Option[Y]) = maybeA.zip(maybeB).headOption
那太好了

现在我想知道,对于varargs和tuple,是否可以以某种方式动态地实现这一点? 签名是什么样子的

def combine[???](options: Option[?]*): Tuple[?]

这只是理论上的,出于无聊的好奇心和理解语言的极限,完全动态是不可能的。因为什么是输入类型,什么是输出类型?但是,您可以将其实现为某种宏,从而推断出正确的输出类型,但这需要知道每个使用站点中的所有值(因此无法传递动态值列表)。但是,您会发现宏很难实现,而且您可能永远都不需要超过x个选项,因此从2个选项到x个选项编写每个方法可能更容易,这会很乏味,但在代码生成器脚本上很容易实现自动化。无论如何,如果您只需要实现而不是自己完成,这基本上就是
tuple
对任何应用程序所做的。因此,您可以使用cats并编写:
(o1,o2,…,on)。tuple
,它将返回一个值的tuple选项。@LuisMiguelMejíaSuárez我想自己实现它(作为一个练习)的原因是因为我希望对选项进行惰性评估。然后输入类型为:=>Option[?]*,这些选项是用lazy val定义的,一旦遇到None,组合器就不应该不必要地计算选项。我将阅读tuple和Applicative,我对tuple的了解是,它是一种将函数的输入参数更改为tuple的方法,这并不完全是我所想的,但我会进一步考虑,我会使用源生成器生成从2到n个选项的所有重载。这只是理论上的,出于无聊的好奇心和理解语言的局限性,完全动态是不可能的。因为什么是输入类型,什么是输出类型?但是,您可以将其实现为某种宏,从而推断出正确的输出类型,但这需要知道每个使用站点中的所有值(因此无法传递动态值列表)。但是,您会发现宏很难实现,而且您可能永远都不需要超过x个选项,因此从2个选项到x个选项编写每个方法可能更容易,这会很乏味,但在代码生成器脚本上很容易实现自动化。无论如何,如果您只需要实现而不是自己完成,这基本上就是
tuple
对任何应用程序所做的。因此,您可以使用cats并编写:
(o1,o2,…,on)。tuple
,它将返回一个值的tuple选项。@LuisMiguelMejíaSuárez我想自己实现它(作为一个练习)的原因是因为我希望对选项进行惰性评估。然后输入类型为:=>Option[?]*,这些选项是用lazy val定义的,一旦遇到None,组合器就不应该不必要地计算选项。我将阅读tuple和Applicative,我对tuple的了解是,它是一种将函数的输入参数更改为tuple的方法,这并不完全是我所想的,但我会进一步考虑,我会使用源生成器生成从2到n选项的所有重载。