给定类似的东西:
class A {
def f(x: X) = ...
def g(y: Y, z: Z) = ...
...
}
如何(自动)提取函数:
object A {
val f' = (a: A, x: X) => a.f(x) // do this automagically for any arbitrary f
val g' = (a: A, y: Y, z: Z) => a.g(y, z) // and deal with arity > 1 too
...
}
使用这个确切的类型签名(首先是对象,然后是参数列表)。让我非常清楚地说明问题:
“给定一个
f(x1: X1, ..., xn: Xn)
在类的上下文中定义的方法A
,如何自动提取一个函数f'
,该函数(i) 接收类型的实例,以及a
A
(ii)与 1:1 的参数列表对应的参数列表,f
即x1: X, ... xn: Xn
实施正是a.f(x1: X1, ..., xn: Xn)
“
甚至:
捕获 lambda 演算的可扩展性概念, 这样您就可以自动
λx.(f x)
从.f
x
f
这可以首先通过找到一种访问标识符的方法来解决f
,g
... 我们可以简单地书写或手写,但让我们沉迷于干燥。a: A
A
f'
g'
PS 也许如果没有运行时反射,这是不可能的(尽管使用 Scala 2.10+ 宏可能是可能的),因为我似乎无法找到一种方法来事先引用f
或g
不引用特定实例 ( a: A
) 的标识符。但这将类似于以下内容,而不必求助于strings
:
A.getMethod("f"): Function2[A, X, ...]
我也意识到这个问题的实际用途可能会帮助参与者提出替代方案,但我是在抽象意义上讨论这个问题。我不是试图解决我已经简化为这个问题的其他问题。我想知道这是否可能:-) 这是一篇非常好的文章,可以真正理解这个问题背后的动机,并对 Scala 上的 Eta 扩展进行了咆哮。