为什么Octave/Matlab使用函数句柄

为什么Octave/Matlab使用函数句柄,matlab,functional-programming,octave,Matlab,Functional Programming,Octave,特殊处理功能有什么好处?比如说, function n = f(x) 2*x endfunction f(2) //outputs 4 f = @f f(2) //outputs 4 如果句柄可以像函数一样被调用,那么我们从被特殊处理的函数中得到什么好处呢。特别是指引用函数的变量不能作为参数传递: function n = m(f,x) f(x) end m(f,2) // generates error since f is called without arguments

特殊处理功能有什么好处?比如说,

function n = f(x)
   2*x
endfunction

f(2) //outputs 4
f = @f
f(2) //outputs 4
如果句柄可以像函数一样被调用,那么我们从被特殊处理的函数中得到什么好处呢。特别是指引用函数的变量不能作为参数传递:

function n = m(f,x)
   f(x)
end

m(f,2) // generates error since f is called without arguments
为什么函数不是像在其他函数语言中一样总是由变量指向的过程

编辑: 我的问题似乎完全被误解了,所以我将重新措辞。比较以下python代码

def f(x):
    return 2*x
def m(f,x):
    return f(x)
m(f,3)
到八度码

function n = f(x)
   2*x
end
function n = m(f,x)
    f(x)
end
m(@f,2) % note that we need the @
那么我的问题是,什么是八度音阶的函数对象?在python中,它只是一个值函数,它是可以分配给变量的基本对象。octave/matlab从像所有其他函数语言一样对待函数和原始对象的不同中获得了什么好处

以下变量将指向内部结构的样子是什么

x = 2
function n = f(x)
   2*x
end
g = @f

在python中,您可以简单地分配g=f,而不需要使用@进行间接寻址。为什么八度音阶不也是这样工作的?它们从特殊处理函数而不是像原始值那样得到什么?

引用函数的变量可以在matlab中作为参数传递。使用以下代码创建一个名为func.m的文件

function [ sqr ] = func( x )
    sqr = x.^2;
end
创建一个名为“test.m”的文件,如下所示

function [ output ] = test( f, x )
    output = f(x);
end
现在,试试下面的方法

f=@func;
output = test(f, 3);

没有什么不同的。这是一个设计决定。这就是matlab/octave的工作原理。这与c的工作原理非常相似

我对这两个函数的内部工作原理都没有复杂的了解,但可以推测,函数只是成为一个符号,可以在运行时访问,并用于调用其定义中指定的指令,这些指令可以是解释指令,也可以是预编译指令。另一方面,函数句柄更类似于函数指针,函数指针与c一样,可以用于重定向到它所指向的函数,也可以作为参数传递

这使得matlab/octave可以完全在自己的文件中定义函数,而不需要运行/导入该文件,就可以将函数加载到内存中。它只需要可访问,即在路径中,当matlab/octave启动新会话时,它将创建可在会话中使用的可用函数/符号的适当表。而对于python,当您在文件中定义函数时,您需要“运行”/导入该文件,以便将函数定义加载到内存中,作为REPL会话本身中的一系列解释指令。这只是一种不同的做事方式,一种并不一定比另一种好。它们只是不同的设计/实现决策。两者都很好


至于matlab/octave是否适合函数式编程/设计时考虑函数式编程,我会说这不是我选择的函数式编程语言;你可以用它,但它不是为那种编程而设计的;它主要是为了科学编程而设计的,它在这方面做得很好。

上一个例子给出了一个错误,因为调用mf,2时没有定义f,而不是因为f没有参数。如果改为f=x.^2;mf,2您将得到预期的结果4。目前还不清楚您在寻找什么样的答案…f显然是指在前面的代码块中定义的函数。。。我只是想节省空间。我编辑了我的问题,希望我的问题更清楚。相关/有趣:或偶数平方=@xx.^2;applyfun=@f,xfx;output=applyfunsquare,3.我不明白这个设计决策是如何让你的第三段成为现实的。Python不能通过使用path变量,然后自动导入在该路径中找到的函数定义来实现同样的功能。与C的区别在于,在C中,程序员需要自动取消引用函数指针才能使用它,而在Octave中则不是这样。Octave将自动为您取消引用函数句柄。所以我的问题可以重新表述为:为什么不让每个函数都只是一个函数句柄?然后octave的行为将类似于python和其他函数式语言。必须有一个基本的设计原因,为什么他们不能/不能这样做,但我看不出来…程序员需要取消引用函数指针Python导入它在路径中找到的函数定义,这仍然会涉及它们进入工作区并占用会话内存。当然,正如您所建议的,如果您希望在matlab/octave中的工作空间中使用这些函数作为句柄,可以将它们转换为函数句柄。但除此之外,函数本质上被美化为“重定向”到外部代码,完全由解释器处理,但我的理解是,它们没有像python那样加载到会话内存中。当然可以
如果是错误的,实际的octave开发人员可能会纠正我的错误,但是在使用函数时,您仍然需要最终将函数加载到内存中,因此Python可以做同样的事情创建一个函数名表——那些使用def语法定义的函数名表——只有在首次使用时才会加载。无论如何,我想我只是在这一点上徒劳地推测。但是谢谢你的帮助: