[英]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.