C 函式式程式設計之區域性套用與部分應用

2022-04-01 23:05:01 字數 1945 閱讀 1771

函式式設計的核心與函式的應用以及函式如何作為演算法的基本模組有關。利用區域性套用技術可以把所有函式看成是函式類的成員,這些函式只有乙個形參,有了區域性套用,才有部分應用。部分應用是使函式模組化成為可能的兩個技術之一,另乙個是組合。

c#函式式程式設計之引數的解耦

區域性套用是一種轉換技術,它把乙個需要接收多個引數的函式轉換為一系列函式,後者每次只接受乙個引數並返回序列中的下乙個函式。在這個函式鏈的末尾,所有的引數都可以使用,並允許原演算法執行自己的操作。

考慮下面這個簡單的函式,它使用了與c#2.0相容的匿名方法定義語法:

funcadd =

delegate(int x, int y)

;

這個加法函式接受兩個引數後返回兩個數的相加結果,呼叫這個函式時,呼叫程式必須同時提供兩個引數,c#語法約束不允許任何其他方法。

func> add =

delegate(int x)

;};

區域性套用的基本原理也可以應用於用lambda語法定義的函式:

funcaddtest = (x, y) => x + y;

使用區域性套用後的函式如下:

func> addtest = x => (y => x + y);

現在把區域性套用技術應用於任意個引數上,假設有乙個函式有以下的引數列表:

func<...> f = (part1, part2, part3, ..., partx) => ...;

區域性套用後的函式簽名格式如下:

func<...> cf = part1 => part2 => part3 => ... => partx => ...;

lambda表示式主體部分**,即最後乙個=> 運算子的右側部分,在轉換過程中保持不變。

型別排列形式的變化遵從同樣的規則,考慮如下的泛型委託型別:

func

應用區域性套用後得到如下的型別排列形式:

func>>>

有趣的是,如果顯式提供lambda表示式的型別或者c#2.0匿名方法的型別,則採用型別推斷也可以推斷出泛型引數,這令人感到奇怪,因為在同樣的情形下,無法用var關鍵字把函式儲存到乙個變數中:

// this is invalid

var mult = (int x, int y) => x * y;

對於內聯的lambda表示式無法呼叫擴充套件方法。

區域性套用技術也可以應用於c#類宣告的比較常規的方法。靜態方法和例項方法都可以應用區域性套用技術。此外,類使得區域性套用函式的外部呼叫成為可能。

c#函式式程式設計之呼叫函式的各部分

使用區域性套用格式函式的最主要理由是只需要部分計算引數而不是全部引數就可以呼叫這個函式。這個過程就是所謂的部分應用,部分應用是一種函式構建技術。

考慮下面這段**,它使用乙個從零開始採用區域性套用格式的函式:

func> add = x => y => x + y;

var add5 = add(5);

這裡呼叫了區域性套用函式add,但是只給它傳遞乙個引數,顯然, 在這種情況下無法進行加法計算,因為它需要兩個引數,用乙個引數呼叫將返回乙個新函式。我們不是立即呼叫這個新函式,而是把它儲存在變數中供以後使用。

呼叫這個新建立的函式可以像呼叫其他函式那樣:

int result = add5(37);

通常,部分應用接受乙個本質屬於泛型的函式,建立乙個畢竟專用的新函式。

c#函式式程式設計之引數順序的重要性

當應用區域性套用技術和部分應用技術時,說明引數順序的重要性有乙個簡單的理由:函式的部分應用只能從引數列表的起始位置開始。在決定引數的順序時,最重要的是考慮函式中哪個引數最有可能使用部分應用。

C 函式式程式設計之快取技術

該節我們將分成兩部分來講解,第一部分為預計算,第二部分則為快取。快取這個技術對應從事開發的人員來說是非常熟悉的,從頁面快取到資料庫快取無處不在,而其最重要的特點就是在第一次查詢後將資料快取,在以後的查詢過程中就無需重新計算而直接從記憶體中將結果返回,大大提高了效能,而我們這裡的快取則集中運用在函式上...

C 函式式程式設計之快取技術

該節我們將分成兩部分來講解,第一部分為預計算,第二部分則為快取。快取這個技術對應從事開發的人員來說是非常熟悉的,從頁面快取到資料庫快取無處不在,而其最重要的特點就是在第一次查詢後將資料快取,在以後的查詢過程中就無需重新計算而直接從記憶體中將結果返回,大大提高了效能,而我們這裡的快取則集中運用在函式上...

C 函式式程式設計之標準高階函式

大家可能對這個名詞並不熟悉,但是這個名詞所表達的事物卻是我們經常使用到的。只要我們的函式的引數能夠接收函式,或者函式能夠返回函式,當然動態生成的也包括在內。那麼我們就將這類函式叫做高階函式。但是今天我們的標題並不是高階函式,而是標準高階函式,既然加上了這個標準,就意味著在函式式程式設計中有一套標準的...