Wolfram mathematica Mathematica嵌套匿名变量Arity函数
我正在尝试将以下scheme代码翻译成Mathematica(版本8,如果需要的话): 然后,您可以执行以下操作: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)
(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谢谢你对我的图像处理问题的回答,我在这里投票支持你,因为其他人强迫你回答这个问题。