繁体   English   中英

为什么Octave / Matlab使用功能句柄

[英]Why does Octave/Matlab use function handles

特别对待功能有什么好处? 例如,

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中,它只是一个值(函数是可以分配给变量的原始对象)。 像所有其他函数式语言一样,将函数与原始对象区别对待,倍频程/ 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是否适合函数式编程/考虑了函数式编程的设计,我想说它不是函数式编程的首选语言; 您可以使用它进行一些有趣的功能编程 ,但这并不是它的初衷。 它的设计首先考虑了科学程序设计,并且在这一方面表现出色。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM