次のようなものが与えられます:
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)
あるいは:
ラムダ計算の拡張性の概念を捉えて 、.
λx.(f x)
f
x
f
f
これは、識別子、g
、 ... にアクセスする方法を見つけることによって最初に取り組むことができa: A
ますA
。単純に書くことf'
もg'
手で書くこともできますが、DRYness を楽しみましょう。
PS たぶん、これは実行時リフレクションなしでは不可能です (Scala 2.10f
以降のマクロでは可能かもしれませんが)。ただし、に頼る必要なしに、次のようなものになります。g
a: A
strings
A.getMethod("f"): Function2[A, X, ...]
また、質問を実際に使用すると、参加者が代替案を提案するのに役立つ可能性があることも理解していますが、これについては抽象的な意味で議論しています. 私はこの問題に縮小した他の問題を解決しようとはしていません。これが可能かどうかを知りたいと思っています:-)この質問の背後にある動機を実際に理解するための非常に素晴らしい記事です。