在Mathematica中编写函数的函数

时间:2014-07-23 13:53:27

标签: functional-programming wolfram-mathematica currying

我想定义一个运算符,其中输入和输出都是函数。例如,说我有

op1[f_,x_,y_,z_]:= f[y,x,z]
op2[f_,x_,y_,z_]:=f[x,z,y]

我想组合op1op2来获得将f(x,y,z)发送到f(z,x,y)的运算符。但是,Mathematica无法正确解释op1[op2[f,x,y,z],x,y,z]等表达式。

目前唯一的解决方法是

g[x_,y_,z_]:=op2[f,x,y,z];
result[x_,y_,z_]:=op1[g,x,y,z]
  1. 含糊不清的问题:如何让这个不那么笨拙?

  2. 不太模糊:Mathematica中是否存在部分评估的概念,因此A [f, - , - , - ]之类的东西被正确解释为3个变量的函数?

2 个答案:

答案 0 :(得分:1)

首先,你编写op1和op2的方式,它们不在f上运行,也不创建一个函数,只是一个带有该函数的表达式。没关系,但它解释了为什么你没有得到你想要的东西。

作为中间立场你可以这样做:

 In[1]:= myop1[f_][x_, y_, z_] := f[y, x, z];

 In[2]:= myop2[f_][x_, y_, z_] := f[x, z, y];

 In[3]:= myop2[myop1[g]][a, b, c]

 Out[3]= g[c, a, b]

这非常接近你想要的。

答案 1 :(得分:0)

我认为您可以使用Compositionhttp://reference.wolfram.com/language/ref/Composition.html

Composition[op1,op2][x,y,z]

一般情况下,请参阅http://reference.wolfram.com/language/guide/FunctionalProgramming.html了解与函数编程相关的功能。