函式式程式設計(2) 高階函式

2021-09-22 06:58:26 字數 1891 閱讀 8328

1)什麼是程式設計正規化;

2)程式設計函式與數學函式的關係。

上篇文章介紹了函式式程式設計屬於宣告式程式設計正規化中的一種,它仿照數學概念中的公式演算去解決問題,是一種更接近數學語言的程式設計方式。並且我們知道函式式程式設計中所有的函式都是「純函式(pure function)」,因為只有純函式才符合數學中對函式的定義,即:

1)函式均有輸入(均帶有引數)、均有輸出(函式有返回值);

2)使用相同引數呼叫函式,得到的返回值無論何時均相等(不受其他因素影響)。

數學函式中包含一類函式叫「高階函式」,它指「接收乙個(多個)函式作為輸入,或者返回乙個函式」的函式。在函式式程式設計中,同樣存在這樣的高階函式。只要乙個函式包含有乙個(多個)函式作為引數,或者返回另外乙個函式,那麼這個函式就稱為「高階函式」。在.net中我們使用委託來封裝方法,這樣方法就可以像普通型別一樣作為程式之間傳遞的引數、返回值。在.net中已經有很多場合使用委託作為函式的引數,比如在非同步程式設計時呼叫的一些方法均帶有asynccallback委託型別的引數(begininvoke等),尤其是c#3.0出現之後,我們在使用一些類似select()、where()等擴充套件方法時,這些方法均會包含乙個委託型別的引數:

1

string names = ;

2 ienumerable query =names

3 .where(n => n.contains("a"

))4 .orderby(n =>n.length)

5 .select(n =>n.toupper());

6foreach (string name in query) console.writeline(name);

注意上面**中使用lambda表示式就是快速建立委託的一種方式。並且每個委託的簽名幾乎都一致:包含輸入引數,有返回值。

到現在為止,我們很少碰到返回值是委託型別的函式。並不是沒有這樣的函式,只能說c#在容納「函式式程式設計」的程度還不是很夠。我們完全可以自己編寫乙個返回委託型別的「高階函式」,比如數學中為乙個函式求導函式的過程:

1

public

delegate

double function1x(double x); //

一元函式

2public function1x getderivative(function1x func) //

高階函式,函式作為輸入、返回值

3

如上**所示,getderivative()方法包含乙個委託型別引數,代表需要求導函式的函式;並且返回乙個委託型別,代表求得的導函式。getderivative()方法既包含函式作為引數,又能返回乙個函式,因此它屬於「高階函式」。

總結:

1)在程式設計中,我們可以使用「純函式」來代表乙個數學函式。「純函式」無***(side-effect),並且符合數學中對函式的定義。可以這麼說,程式設計函式涵蓋的範圍包含數學函式;

2)如果乙個純函式的引數又是乙個函式,或者該純函式能夠返回另乙個函式,那麼這個純函式就稱為「高階函式」,它與數學中的高階函式對應。

到目前為止,我所講到的所有內容都是為了讓你在「程式」和「數學」之間找到乙個共同點,能夠一一模擬。而這個過程中,「純函式」無疑是重點。

下面分享乙個demo,能夠繪製任意給定函式的曲線圖,並能夠繪製指定點(x)處的切線。demo中主要演示乙個求導函式的高階函式和乙個求切線函式的高階函式:

(demo中解析函式表示式的過程使用到了老外的方法,站在巨人肩膀上:))下面是效果圖:

函式式程式設計(1)

出處:

分類: 

非主流玩一玩

標籤: 

c#, 

函式式程式設計

函式式程式設計(2) 高階函式

1 什麼是程式設計正規化 2 程式設計函式與數學函式的關係。上篇文章介紹了函式式程式設計屬於宣告式程式設計正規化中的一種,它仿照數學概念中的公式演算去解決問題,是一種更接近數學語言的程式設計方式。並且我們知道函式式程式設計中所有的函式都是 純函式 pure function 因為只有純函式才符合數學...

函式式程式設計 高階函式

高階函式英文叫higher order function。什麼是高階函式?我們以實際 為例子,一步一步深入概念。1 變數可以指向函式 以python內建的求絕對值的函式abs 為例,呼叫該函式用以下 abs 10 10但是,如果只寫abs呢?abs 可見,abs 10 是函式呼叫,而abs是函式本身...

Python 函式式程式設計 高階函式

functional programming,函式式程式設計。python對函式式程式設計提供部分支援。對於純函式程式設計,對任一函式,只要輸入是確定的,輸出就是確定的,可稱之為無 我們知道函式的計算結果可以賦值給變數,例如x abs 5 同理,變數也可以指向函式,例如f abs。如果乙個變數指向了...