Wolfram mathematica Mathematica嵌套匿名变量Arity函数

Wolfram mathematica Mathematica嵌套匿名变量Arity函数,wolfram-mathematica,anonymous-function,arity,Wolfram Mathematica,Anonymous Function,Arity,我正在尝试将以下scheme代码翻译成Mathematica(版本8,如果需要的话): 然后,您可以执行以下操作: (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)

我正在尝试将以下scheme代码翻译成Mathematica(版本8,如果需要的话):

然后,您可以执行以下操作:

(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抱怨说
函数
的“参数说明”应该是“一个符号或符号列表”。我知道我可以使用
()&
风格的匿名函数,并使用
##
获取所有参数,但问题是,当我嵌套其中两个匿名函数时,我失去了从内部函数访问外部参数的能力


如何编写具有变量arity(和命名参数)的匿名函数?或者我应该用Mathematica中的另一种方法来解决这个问题?

我不确定这个函数是否满足您的要求,但是您可以使用
With
来捕获外部函数的
慢序列(#

lift[g_] := Function[
  With[{fs = ##},
   Function[
    With[{args = ##},
     g @@ Map[(#[args]) &, List[fs]]]]]]
然后:

->f[a[c,d],b[c,d]]

或者,更具可读性:

lift[g_] := Function[
  With[{fs = g[##]},
   Through[fs[##]] &]]

我不确定此函数是否满足您的要求,但您可以使用
With
捕获外部函数的
慢序列(##)

lift[g_] := Function[
  With[{fs = ##},
   Function[
    With[{args = ##},
     g @@ Map[(#[args]) &, List[fs]]]]]]
然后:

->f[a[c,d],b[c,d]]

或者,更具可读性:

lift[g_] := Function[
  With[{fs = g[##]},
   Through[fs[##]] &]]

尼基回答得很好。我希望这一条可以补充它

您可以使用
模块
创建临时函数,该模块为您提供了参数规范的全套模式选项。例如,使用nikie的简明方法:

lift1[g_] := Module[{fn}, fn[a__] := Through[g[a][##]] &; fn]

lift1[f][a, b][c, d]
在这种特殊情况下,您还可以使用如下
子值
规则:

lift2[g_][h__] := Through[g[h][##]] &

lift2[f][a, b][c, d]
甚至没有
功能

lift3[g_][h__][i__] := Through[ g[h][i] ]

lift3[f][a, b][c, d]

尼基回答得很好。我希望这一条可以补充它

您可以使用
模块
创建临时函数,该模块为您提供了参数规范的全套模式选项。例如,使用nikie的简明方法:

lift1[g_] := Module[{fn}, fn[a__] := Through[g[a][##]] &; fn]

lift1[f][a, b][c, d]
在这种特殊情况下,您还可以使用如下
子值
规则:

lift2[g_][h__] := Through[g[h][##]] &

lift2[f][a, b][c, d]
甚至没有
功能

lift3[g_][h__][i__] := Through[ g[h][i] ]

lift3[f][a, b][c, d]

难道你不能使用带
将外部函数的
序列放入一个常量中吗?然后,您也可以在内部函数中访问它。难道您不能使用
With
将外部函数的
序列放入常量中吗?然后你也可以在内部函数中访问它。是的,这正是我想要的!另外,我也不知道通过
功能的
,谢谢@nikie谢谢你回答我的图像处理问题,我在这里投票支持你,因为其他人强迫你回答这个问题。是的,这正是我想要的!另外,我也不知道通过
功能的
,谢谢@nikie谢谢你对我的图像处理问题的回答,我在这里投票支持你,因为其他人强迫你回答这个问题。