本文介紹純功能性轉換的概念和術語。 轉換數據的功能轉換方法會產生程式碼,其程式設計速度較快、更具表達性,而且比傳統命令式程序設計更容易偵錯和維護。
請注意,本節中的文章並非用來完整說明功能性程序設計。 相反地,這些文章會識別一些功能性程序設計功能,讓您更輕鬆地將 XML 從一個圖形轉換成另一個圖形。
什麼是純粹的功能轉換
在 純功能轉換中,一組稱為 純函式的函式會定義如何將一組結構化數據從其原始形式轉換成另一種形式。 “pure” 一詞表示函式 是可組合的,這需要這些函式是:
- 自成一體,以便可以自由排序和重新排列,無需與程序的其他部分糾纏或相互依賴。 純轉換對其環境沒有任何瞭解或影響。 也就是說,轉換中使用的函式沒有任何 副作用。
- 無狀態,因此在同一個輸入上執行相同函式或特定函式集一律會產生相同的輸出。 純轉換對其先前的使用沒有記憶。
這很重要
在本教學課程的其餘部分,「純函式」一詞會用在一般意義上來表示程序設計方法,而不是特定的語言功能。
請注意,純函式必須在 C# 中實作為方法,以及做為 Visual Basic 中的函式。
您不應該將純函式與C++中的純虛擬方法混淆。 後者表示包含類別是抽象的,而且未提供任何方法主體。
函數程式設計
功能程序設計 是直接支援純功能性轉換的程序設計方法。
從歷史上看,ML、Scheme、Haskell 和 F# 等一般用途的功能程式設計語言主要對學術界感興趣。 雖然一直有可能在 C# 和 Visual Basic 撰寫純功能性轉換,但這樣做的難度並沒有讓大多數程式設計人員成為有吸引力的選項。 不過,在這些語言的最新版本中,Lambda 運算式和型別推斷等新語言建構可讓功能性程序設計更容易且更具生產力。
如需功能程式設計的詳細資訊,請參閱 功能性程式設計與命令式程序設計。
網域特定的功能程式設計語言
雖然一般功能程式設計語言尚未廣泛採用,但某些領域特定的功能程序設計語言已取得較佳的成功。 例如,級聯樣式表 (CSS) 可用來判斷許多網頁的外觀和風格,而可延伸樣式表單語言轉換 (XSLT) 樣式表單則廣泛用於 XML 數據作。 如需 XSLT 的詳細資訊,請參閱 XSLT 轉換。
術語
下列清單會定義一些與功能轉換相關的詞彙。
高階(第一級)函數
可視為程式設計物件的函式。 例如,可以將較高順序的函式傳遞給其他函式或從其他函式傳回。 在 C# 和 Visual Basic 中,委派和 Lambda 運算式是支援較高順序函式的語言功能。 若要撰寫較高順序的函式,您可以宣告一或多個自變數來接受委派,而且您在呼叫它時通常會使用 Lambda 運算式。 許多標準查詢運算子都是較高順序的函式。
如需詳細資訊,請參閱標準查詢運算符概觀 (C#) 和標準查詢運算符概觀 (Visual Basic)。
Lambda 表達式
基本上,這是一個內嵌匿名函式,適用於需要委派型別的場合。 這是 Lambda 表達式的簡化定義,但適用於本教學課程的目的。
如需詳細資訊,請參閱 Lambda 運算式 (C# 程式設計手冊) 和 Lambda 運算式 (Visual Basic)。
收集
結構化數據集,通常是統一型別。 若要與 LINQ 相容,集合必須實作 IEnumerable 介面或 IQueryable 介面(或其中一個泛型對應項,IEnumerator<T> 或 IQueryable<T>)。
Tuple (匿名類型)
Tuple 是一個數學概念,是由有限序列的物件組成,每個物件都有特定的類型。 Tuple 也稱為已排序列表。 匿名類型是這個概念的語言實作,可宣告未命名的類別類型,以及同時具現化該類型的物件。
如需詳細資訊,請參閱匿名型別(C# 程式設計手冊)和匿名型別(Visual Basic)。
類型推斷(即隱含類型)
編譯程式在沒有明確型別宣告的情況下判斷變數類型的能力。
如需詳細資訊,請參閱隱含型別局部變數(C# 程式設計手冊)和本機類型推斷(Visual Basic)。
延遲執行和延遲評估
將表達式的評估延遲,直到實際需要該表達式的解析值時才進行。 集合支援延後執行。
如需 C# 的詳細資訊,請參閱 LINQ 查詢簡介 (C#)和 LINQ to XML 中的延遲執行和延遲評估 (C#) 。
如需 Visual Basic 的詳細資訊,請參閱 LINQ to XML 中的基本查詢作業 (Visual Basic)和延遲執行和延遲評估 (Visual Basic)。
本節中的程式代碼範例會使用這些語言功能。