簡體   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