Scala暗示不适用

时间:2014-05-07 07:48:49

标签: scala implicit boilerplate unapply

我试图隐式地将类实例解构为元组以创建更好的DSL语法。

以下是我正在尝试做的简化示例:

class Pair[A,B](a: A, b: B){
  def left = a
  def right = b
}
val pair = new Pair(1,2)
implicit def unpair[T1 <: Int, T2 <: Int](p: Pair[T1,T2]) = {
  (p.left, p.right)
}
val(a,b) = pair

结果:

error: constructor cannot be instantiated to expected type;
 found   : (T1, T2)
 required: Pair[Int,Int]

我知道我可以使用unapply方法定义一个伴随对象,并手动处理解构(或显式隐式调用),但这会产生不需要的样板。

修改 好的,只是为了提供更多的上下文,Pair嵌入在实现map,flatMap和withFilter的实例中(即用于理解)。因此,期望的用法类似于:

val q = for{
  (a,b) <- tableA join tableB on(...)
  (c,d) <- tableC leftJoin tableD on(...)
  ....
} yield(a,b,c,d,...)

我想避免的是使Pair成为一个案例类(或者将自定义伴随对象添加到现有的Pair类),并且每次我连接表时都必须Pair(a,b) <- tableA join tableB on(...)(经常阅读)

原始

有没有办法在Scala 2.10或2.11中解决这个问题?从2.8 / 2.9天开始有一些较旧的SO线程表明这种功能是不可能的,但我希望自那时起事情发生了变化,或者有可用的解决方法。

2 个答案:

答案 0 :(得分:2)

您需要设置a和b的类型:

 val(a,b): (Int, Int) = pair

答案 1 :(得分:1)

如果你只想提取左右(我猜你的例子),为什么不用更少的代码来解决你的问题:

case class Pair[A, B](left: A, right: B)

val pair = Pair(1, 2)

val Pair(a, b) = pair

println(a, b)