如何在不依赖Product的情况下为元组绑定类型参数?

时间:2017-06-28 01:33:55

标签: scala

我尝试使用我想绑定的类型参数声明一个函数,以便只接受TupleN的实例。但是,我不想作为案例类的实例绑定Product,例如,不应该被接受。例如,如果函数名为foo:

case class Foo(a: Int, b: String)
foo(Foo(1, "str")) // should not compile
foo((1, "str"))    // should compile

我可以通过枚举自定义类型类的所有TupleN个实例,然后使用类型参数的上下文绑定来实现此目的,但我更愿意避免使用它。

是否有可能以更简单的方式做到这一点?

2 个答案:

答案 0 :(得分:1)

不,这是正确的做法。你可以使用宏来做到这一点,但这并不简单。

答案 1 :(得分:1)

如果您可以依赖shapeless,则可以依赖IsTuple类型类来提供给定类型为Scala元组的证据:

import shapeless._

def foo[A: IsTuple](v: A) = ???
foo((1, "str")) // compiles
foo(Foo(1, "str")) // does not compile due to lack of evidence