我尝试使用我想绑定的类型参数声明一个函数,以便只接受TupleN
的实例。但是,我不想作为案例类的实例绑定Product
,例如,不应该被接受。例如,如果函数名为foo:
case class Foo(a: Int, b: String)
foo(Foo(1, "str")) // should not compile
foo((1, "str")) // should compile
我可以通过枚举自定义类型类的所有TupleN
个实例,然后使用类型参数的上下文绑定来实现此目的,但我更愿意避免使用它。
是否有可能以更简单的方式做到这一点?
答案 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