我想定义以下两个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。当然,问题是类型擦除。类型擦除f
和g
都是Function1
后,两个Pr
函数无法区分。我认为使用类型标签创建单个Pr
函数可能会有所帮助,但我不确定如何在每种情况下更改返回类型。
对任何建议开放;那些可以在不使用额外库(Shapeless,Scalaz)的情况下解决这个问题的人是首选。