次のスキーム コードを Mathematica に変換しようとしています (問題がある場合はバージョン 8)。
(define (((lift g) . fs) . args)
(apply g
(map (lambda (f) (apply f args))
fs)))
次に、次のようなことができます。
(let ((add (lift +))
(square (lift sqr)))
((add (square sin) (square cos)) 42))
; returns 1, since sin^2(42) + cos^2(42) = 1
パーツ(add (square sin) (square cos))
は関数を作成しますx -> sin^2(x) + cos^2(x)
。
とにかく、Mathematica でこれをコーディングしようとしましたが、あまりうまくいかないようです。書きたいことは次のとおりです。
lift[g_] := Function[{fs__}, Function[{args__},
g @@ Map[(# @@ args)&, fs]]]
私は、それぞれの関数へのすべての引数のリストにバインドしたいfs__
と考えています。args__
しかし、Mathematica は、 の「パラメータ仕様」はFunction
「シンボルまたはシンボルのリスト」であるべきだと文句を言います。()&
スタイル無名関数を使用してすべての引数を取得できることはわかってい##
ますが、問題は、これらの無名関数を 2 つ入れ子にすると、内部関数内から外部引数にアクセスできなくなることです。
可変アリティ (および名前付き引数) を持つ無名関数を作成するにはどうすればよいですか? または、Mathematica でこの問題を別の方法で解決する必要がありますか?