Scala中所有函数的超类型是什么?

Scala中所有函数的超类型是什么?,scala,reflection,macros,functional-programming,scala-macros,Scala,Reflection,Macros,Functional Programming,Scala Macros,我知道我可以对Function1或Function2等进行instanceOf检查,但是否有一种通用方法可以查看某个对象是否为函数(它可以有任意数量的参数)。我试着这样定义: type FuncType = (Any*) -> Any call = (name: Any, args: Any*) -> if name.isFunction then name.castAs[Function].apply(args) else name aFunction = (name: Stri

我知道我可以对
Function1
Function2
等进行
instanceOf
检查,但是否有一种通用方法可以查看某个对象是否为函数(它可以有任意数量的参数)。我试着这样定义:

type FuncType = (Any*) -> Any
call = (name: Any, args: Any*) -> if name.isFunction then name.castAs[Function].apply(args) else name
aFunction = (name: String) => "Hello " + name
notAFunction = "Hello rick"
call(aFunction, "rick")
call(notAFunction)
但这也不起作用。基本上,我有一些代码如下所示:

type FuncType = (Any*) -> Any
call = (name: Any, args: Any*) -> if name.isFunction then name.castAs[Function].apply(args) else name
aFunction = (name: String) => "Hello " + name
notAFunction = "Hello rick"
call(aFunction, "rick")
call(notAFunction)

没有适用于所有函数类型的通用超类型

Scala无法抽象函数的算术性。但是,您可以查看库,它引入了一个名为
HList
的东西,您可以使用它来抽象函数的arity

然而,我认为这不是你真正需要的。听起来你只是想做一个类似“这是一个函数吗?”的检查,你可能会觉得没有算术不可知的
函数
超类型很奇怪,但是如果你想用它做一些有用的事情,你几乎总是需要知道函数的算术


或者,您可以使用函数上的
curried
方法执行某些操作,该方法将返回
Function1

否,没有办法执行此操作,除非仔细检查
Function1
Function2
等。每个特征的父项都是
AnyRef
,这不会帮你把它们和其他东西区别开来。这些特征的
apply
方法采用不同数量的参数,因此无法为它们提供具有apply方法的父代。你可能最接近你想要做的事情是:

def arbitraryFunction(function: AnyRef, args: Seq[Any]): Any = {
  function match {
    case f: Function1[Any, Any] => f(args(0))
    case f: Function2[Any, Any, Any] => f(args(0), args(1))
    // and so on
  }
}
但这是疯狂和危险的,如果类型错误,将在运行时抛出异常,例如

arbitraryFunction((x: Int) => x * 2, List("I'm a String!"))