Scala函数是否可以编写为获取任何函数并返回其参数反转的函数?

Scala函数是否可以编写为获取任何函数并返回其参数反转的函数?,scala,higher-order-functions,Scala,Higher Order Functions,我知道这在lisp中很简单,但Scala有一个强大的类型系统,这让我怀疑这样一个函数是否可行。 如果不可能,宏呢?Scala宏可以做到这一点吗 PS:以下是Clojure中的函数: (fn [f](fn f* [& args] (apply f (reverse args)))) 主要的困难是,您必须找出具有反向参数的函数的类型,如果没有通用的宏,就不可能这样做 但因为Scala只支持最多22个参数的函数,所以您可以为所有可能的算术函数编写或生成23个实现。以下是包含3个参数的函数的

我知道这在lisp中很简单,但Scala有一个强大的类型系统,这让我怀疑这样一个函数是否可行。 如果不可能,宏呢?Scala宏可以做到这一点吗

PS:以下是Clojure中的函数:

 (fn [f](fn f* [& args] (apply f (reverse args))))

主要的困难是,您必须找出具有反向参数的函数的类型,如果没有通用的宏,就不可能这样做

但因为Scala只支持最多22个参数的函数,所以您可以为所有可能的算术函数编写或生成23个实现。以下是包含3个参数的函数的示例:

def reverse[A, B, C, R](f: (A, B, C) => R): (C, B, A) => R = 
  (c, b, a) => f(a, b, c)
使用宏时,虽然可以用通用的方式执行。最简单的解决方案可能是使用库,该库在内部使用宏实现。以下是一个不成形的示例:

import shapeless._
import shapeless.ops.function._
import shapeless.ops.hlist._

def reverseArgs[Func, Args <: HList, Res, RevArgs <: HList](f: Func)(implicit
  // Convert the function to a function from a single HList argument.
  fnToProduct: FnToProduct.Aux[Func, Args => Res], 
  // Compute the type of the reversed arguments HList.
  r1: Reverse.Aux[Args, RevArgs],
  // Get the function to reverse the reversed arguments back.
  reverse: Reverse.Aux[RevArgs, Args],
  // Convert the function of a single HList argument to a normal function
  fnFromProduct: FnFromProduct[RevArgs => Res]
): fnFromProduct.Out = {
  fnFromProduct((args: RevArgs) => fnToProduct(f)(reverse(args)))
}

这些参数都是同一类型的吗?我什么时候需要它?如果参数是不同类型的,我会用参数调用反转函数,这些参数与我传递它们的顺序不匹配?如果我不立即执行该函数,为什么我要传递该函数而不仅仅是要反转的参数?您是否可以使用纯Scala(无宏)添加arity 3函数的情况?我不明白你为什么定义r1。你没有用它。(我不知道任何不成形的,所以也许这就是原因)。@HappyFace我添加了一个纯Scala的案例。至于
r1
,是的,我没有使用它。正如注释所说,它只是用来计算反转参数列表的类型。实际使用的函数是reverse的reverse(称为
reverse
)。
scala> val f = reverseArgs((i: Int, d: Double, s: String) => (i + d).toString + s)
f: (String, Double, Int) => String = shapeless.ops.FnFromProductInstances$$anon$4$$Lambda$1191/2014583896@4d7933e7

scala> f("a", 1.5, 2)
res1: String = 3.5a