在不同返回类型的情况下克服Scala中的类型擦除

时间:2016-04-12 22:26:26

标签: scala generics type-erasure

我想定义以下两个Scala函数:

def Pr(
  f: Int => Int,
  g: Tuple3[Int, Int, Int] => Int
): Tuple2[Int, Int] => Int = {
  def recurse(x: Int, counter: Int): Int = counter match {
    case 0 => f(x)
    case y => g(x, y-1, recurse(x, y-1))
  }
  (recurse _).tupled
}

def Pr(
  f: Tuple2[Int, Int] => Int,
  g: Tuple4[Int, Int, Int, Int] => Int
): Tuple3[Int, Int, Int] => Int = {
  def recurse(x1: Int, x2: Int, counter: Int): Int = counter match {
    case 0 => f(x1, x2)
    case y => g(x1, x2, y-1, recurse(x1, x2, y-1))
  }
  (recurse _).tupled
}

这里的基本想法是,如果f是n-ary而g是(n + 2)-ary,那么Pr(f,g)是(n + 1)-ary。当然,问题是类型擦除。类型擦除fg都是Function1后,两个Pr函数无法区分。我认为使用类型标签创建单个Pr函数可能会有所帮助,但我不确定如何在每种情况下更改返回类型。

对任何建议开放;那些可以在不使用额外库(Shapeless,Scalaz)的情况下解决这个问题的人是首选。

0 个答案:

没有答案