我正在尝试将以下方案代码转换为 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
应该是“一个符号或符号列表”。我知道我可以使用()&
样式匿名函数并使用##
来获取所有参数,但问题是当我嵌套其中两个匿名函数时,我失去了从内部函数访问外部参数的能力。
如何编写具有可变参数(和命名参数)的匿名函数?还是我应该在 Mathematica 中以另一种方式解决这个问题?